home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume10 / b+tree_mjr / part01 next >
Encoding:
Text File  |  1990-01-19  |  64.3 KB  |  2,489 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v10i027: B+tree library, part01 of 5
  3. from: mjr@umiacs.UMD.EDU (Marcus J. Ranum)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 10, Issue 27
  7. Submitted-by: mjr@umiacs.UMD.EDU (Marcus J. Ranum)
  8. Archive-name: b+tree_mjr/part01
  9.  
  10.     This is the source code for a variable-length key variable
  11. page size b+tree library. Also included is source for a variety of
  12. test programs, a semi-useable record manager, and a dbm-lookalike
  13. library built on top of the record manager and b+tree. (dbm(3) will
  14. blow it away performance-wise, of course).
  15.  
  16.     This software has been tested (and works) on the following:
  17. Pyramid/OSx, Sun4/SunOs, Sun3/SunOs, Digital Vax/BSD4.3,
  18. Digital DECstation3100/Ultrix
  19.  
  20.     This software has been tested and found NOT to work on the
  21. following:
  22. SCO Xenix - I have no idea why because I don't have one
  23.  
  24.  
  25. Contents::
  26. ----------------------------------------------------------------------
  27. COPYRIGHT    - licensing/copyright notice. read it, please.
  28.  
  29. Makefile    - makefile
  30.  
  31. btlib        - source for the b+tree library. directions for
  32.         compilation are in btlib/README.
  33.  
  34. doc        - manual pages for the b+tree library
  35.  
  36. btdbmlib    - source for a sort of record management library
  37.         that is pretty much of a "toy" library, and will
  38.         probably not cut it for serious projects unless it
  39.         is beefed-up a bit. Also includes source for a 
  40.         dbm-clone library that uses b+tree indexes.
  41.         the record manager was designed for an application
  42.         I wrote that demanded being able to store things
  43.         of practically any size, and did not require high
  44.         performance. if you are trying to write a real
  45.         database, please don't waste your time even looking
  46.         at it.
  47.  
  48. utils        - utility programs and toys, including test-rack
  49.         software for the b+tree
  50.  
  51. --slicez--dicez--choppez--shreddez--slicez--dicez--choppez--shreddez--slicez--
  52. #! /bin/sh
  53. # This is a shell archive.  Remove anything before this line, then unpack
  54. # it by saving it into a file and typing "sh file".  To overwrite existing
  55. # files, type "sh file -c".  You can also feed this as standard input via
  56. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  57. # will see the following message at the end:
  58. #        "End of archive 1 (of 5)."
  59. # Contents:  b+tree b+tree/Makefile b+tree/README b+tree/btdbmlib
  60. #   b+tree/btdbmlib/btdbm.h b+tree/btdbmlib/btdbmclose.c
  61. #   b+tree/btdbmlib/btdbmdelete.c b+tree/btdbmlib/btdbmfetch.c
  62. #   b+tree/btdbmlib/btdbmfirstkey.c b+tree/btdbmlib/btdbmnextkey.c
  63. #   b+tree/btdbmlib/btdbmopen.c b+tree/btdbmlib/btdbmstore.c
  64. #   b+tree/btdbmlib/stclose.c b+tree/btdbmlib/stcopy.c
  65. #   b+tree/btdbmlib/stdecref.c b+tree/btdbmlib/sterrs.c
  66. #   b+tree/btdbmlib/stgethed.c b+tree/btdbmlib/stincref.c
  67. #   b+tree/btdbmlib/stlinka.c b+tree/btdbmlib/stoconf.h
  68. #   b+tree/btdbmlib/stointern.h b+tree/btdbmlib/stopen.c
  69. #   b+tree/btdbmlib/stputhed.c b+tree/btdbmlib/stread.c
  70. #   b+tree/btdbmlib/streallocbuf.c b+tree/btdbmlib/stunlink.c
  71. #   b+tree/btdbmlib/stwrite.c b+tree/btdbmlib/stwsuper.c b+tree/btlib
  72. #   b+tree/btlib/Makefile b+tree/btlib/btclose.c
  73. #   b+tree/btlib/bterrors.c b+tree/btlib/btfind.c
  74. #   b+tree/btlib/btgoto.c b+tree/btlib/btlabel.c b+tree/btlib/btseek.c
  75. #   b+tree/btlib/btzap.c b+tree/doc b+tree/doc/Makefile b+tree/utils
  76. #   b+tree/utils/flog.sh b+tree/utils/words.c
  77. # Wrapped by mjr@atreus on Fri Jan 19 10:34:57 1990
  78. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  79. if test ! -d 'b+tree' ; then
  80.     echo shar: Creating directory \"'b+tree'\"
  81.     mkdir 'b+tree'
  82. fi
  83. if test -f 'b+tree/Makefile' -a "${1}" != "-c" ; then 
  84.   echo shar: Will not clobber existing file \"'b+tree/Makefile'\"
  85. else
  86. echo shar: Extracting \"'b+tree/Makefile'\" \(855 characters\)
  87. sed "s/^X//" >'b+tree/Makefile' <<'END_OF_FILE'
  88. X# 
  89. X#
  90. X#/*
  91. X#         (C) Copyright, 1988, 1989 Marcus J. Ranum
  92. X#                    All rights reserved
  93. X#
  94. X#
  95. X#          This software, its documentation,  and  supporting
  96. X#          files  are  copyrighted  material  and may only be
  97. X#          distributed in accordance with the terms listed in
  98. X#          the COPYRIGHT document.
  99. X#*/
  100. X#
  101. X# $Header: /atreus/mjr/hacks/btree/Makefile,v 1.1 89/10/24 10:09:36 mjr Rel $
  102. X#
  103. X
  104. XMAKE= make
  105. X
  106. XLIB=    libbtree.a
  107. X
  108. XSRCDIR= /users/mjr/hacks/btree
  109. X
  110. Xall:    
  111. X    cd btlib; $(MAKE)
  112. X    cd btdbmlib; $(MAKE)
  113. X    cd utils; $(MAKE)
  114. X    cd doc; $(MAKE)
  115. X
  116. Xclean:
  117. X    cd btlib; $(MAKE) clean
  118. X    cd btdbmlib; $(MAKE) clean
  119. X    cd utils; $(MAKE) clean
  120. X    cd doc; $(MAKE) clean
  121. X
  122. Xci:
  123. X    cd btlib; $(MAKE) ci
  124. X    cd btdbmlib; $(MAKE) ci
  125. X    cd utils; $(MAKE) ci
  126. X    cd doc; $(MAKE) ci
  127. X    ci -u Makefile README < /dev/null
  128. X
  129. Xlint:    
  130. X    cd btlib; $(MAKE) lint
  131. X    cd btdbmlib; $(MAKE) lint
  132. END_OF_FILE
  133. if test 855 -ne `wc -c <'b+tree/Makefile'`; then
  134.     echo shar: \"'b+tree/Makefile'\" unpacked with wrong size!
  135. fi
  136. # end of 'b+tree/Makefile'
  137. fi
  138. if test -f 'b+tree/README' -a "${1}" != "-c" ; then 
  139.   echo shar: Will not clobber existing file \"'b+tree/README'\"
  140. else
  141. echo shar: Extracting \"'b+tree/README'\" \(1489 characters\)
  142. sed "s/^X//" >'b+tree/README' <<'END_OF_FILE'
  143. X
  144. X    This is the source code for a variable-length key variable
  145. Xpage size b+tree library. Also included is source for a variety of
  146. Xtest programs, a semi-useable record manager, and a dbm-lookalike
  147. Xlibrary built on top of the record manager and b+tree. (dbm(3) will
  148. Xblow it away performance-wise, of course).
  149. X
  150. X    This software has been tested (and works) on the following:
  151. XPyramid/OSx, Sun4/SunOs, Sun3/SunOs, Digital Vax/BSD4.3,
  152. XDigital DECstation3100/Ultrix
  153. X
  154. X    This software has been tested and found NOT to work on the
  155. Xfollowing:
  156. XSCO Xenix - I have no idea why because I don't have one
  157. X
  158. X
  159. XContents::
  160. X----------------------------------------------------------------------
  161. XCOPYRIGHT    - licensing/copyright notice. read it, please.
  162. X
  163. XMakefile    - makefile
  164. X
  165. Xbtlib        - source for the b+tree library. directions for
  166. X        compilation are in btlib/README.
  167. X
  168. Xdoc        - manual pages for the b+tree library
  169. X
  170. Xbtdbmlib    - source for a sort of record management library
  171. X        that is pretty much of a "toy" library, and will
  172. X        probably not cut it for serious projects unless it
  173. X        is beefed-up a bit. Also includes source for a 
  174. X        dbm-clone library that uses b+tree indexes.
  175. X        the record manager was designed for an application
  176. X        I wrote that demanded being able to store things
  177. X        of practically any size, and did not require high
  178. X        performance. if you are trying to write a real
  179. X        database, please don't waste your time even looking
  180. X        at it.
  181. X
  182. Xutils        - utility programs and toys, including test-rack
  183. X        software for the b+tree
  184. END_OF_FILE
  185. if test 1489 -ne `wc -c <'b+tree/README'`; then
  186.     echo shar: \"'b+tree/README'\" unpacked with wrong size!
  187. fi
  188. # end of 'b+tree/README'
  189. fi
  190. if test ! -d 'b+tree/btdbmlib' ; then
  191.     echo shar: Creating directory \"'b+tree/btdbmlib'\"
  192.     mkdir 'b+tree/btdbmlib'
  193. fi
  194. if test -f 'b+tree/btdbmlib/btdbm.h' -a "${1}" != "-c" ; then 
  195.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbm.h'\"
  196. else
  197. echo shar: Extracting \"'b+tree/btdbmlib/btdbm.h'\" \(1027 characters\)
  198. sed "s/^X//" >'b+tree/btdbmlib/btdbm.h' <<'END_OF_FILE'
  199. X#ifndef    _DEF_BTDBM_H
  200. X
  201. X#ifndef    _DEF_BTREE_H
  202. X#include    <btree.h>
  203. X#endif
  204. X
  205. X#ifndef    _DEF_STO_H
  206. X#include    <store.h>
  207. X#endif
  208. X
  209. X/*
  210. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  211. X                    All rights reserved
  212. X
  213. X
  214. X          This software, its documentation,  and  supporting
  215. X          files  are  copyrighted  material  and may only be
  216. X          distributed in accordance with the terms listed in
  217. X          the COPYRIGHT document.
  218. X*/
  219. X
  220. X
  221. X/*
  222. X    $Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbm.h,v 1.1 89/10/24 10:09:19 mjr Rel $
  223. X*/
  224. X
  225. X#define    BTDBM_INSERT    0
  226. X#define    BTDBM_REPLACE    1
  227. X
  228. Xtypedef    struct    {
  229. X    bt_chrp    dptr;
  230. X    int    dsize;
  231. X} btdatum;
  232. X
  233. Xstruct    btdbm    {
  234. X    BT_INDEX    *bt;
  235. X    STORE        *st;
  236. X    int        errno;
  237. X};
  238. X#define    BTDBM    struct    btdbm
  239. X
  240. X#define    btdbm_error(db)        (db->errno)
  241. X#define    btdbm_clearerror(db)    (db->errno = 0)
  242. X#define    btdbm_btree(db)        (db->bt)
  243. X#define    btdbm_storefile(db)    (db->bt)
  244. X
  245. Xextern    BTDBM    *btdbm_open();
  246. Xextern    btdatum    btdbm_fetch();
  247. Xextern    btdatum    btdbm_nextkey();
  248. Xextern    btdatum    btdbm_firstkey();
  249. X
  250. X#define    _DEF_BTDBM_H
  251. X#endif
  252. END_OF_FILE
  253. if test 1027 -ne `wc -c <'b+tree/btdbmlib/btdbm.h'`; then
  254.     echo shar: \"'b+tree/btdbmlib/btdbm.h'\" unpacked with wrong size!
  255. fi
  256. # end of 'b+tree/btdbmlib/btdbm.h'
  257. fi
  258. if test -f 'b+tree/btdbmlib/btdbmclose.c' -a "${1}" != "-c" ; then 
  259.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmclose.c'\"
  260. else
  261. echo shar: Extracting \"'b+tree/btdbmlib/btdbmclose.c'\" \(691 characters\)
  262. sed "s/^X//" >'b+tree/btdbmlib/btdbmclose.c' <<'END_OF_FILE'
  263. X#include    <stdio.h>
  264. X#include    <sys/types.h>
  265. X#include    <btdbm.h>
  266. X
  267. X
  268. X/*
  269. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  270. X                    All rights reserved
  271. X
  272. X
  273. X          This software, its documentation,  and  supporting
  274. X          files  are  copyrighted  material  and may only be
  275. X          distributed in accordance with the terms listed in
  276. X          the COPYRIGHT document.
  277. X*/
  278. X
  279. X
  280. X#ifndef    lint
  281. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmclose.c,v 1.1 89/10/24 10:09:10 mjr Rel $";
  282. X#endif
  283. X
  284. X
  285. Xbtdbm_close(db)
  286. XBTDBM    *db;
  287. X{
  288. X    if(store_close(db->st) != STO_OK || bt_close(db->bt) != BT_OK) {
  289. X        btdbm_error(db) = 1;
  290. X        return(1);
  291. X    }
  292. X    btdbm_clearerror(db);
  293. X    return(0);
  294. X}
  295. END_OF_FILE
  296. if test 691 -ne `wc -c <'b+tree/btdbmlib/btdbmclose.c'`; then
  297.     echo shar: \"'b+tree/btdbmlib/btdbmclose.c'\" unpacked with wrong size!
  298. fi
  299. # end of 'b+tree/btdbmlib/btdbmclose.c'
  300. fi
  301. if test -f 'b+tree/btdbmlib/btdbmdelete.c' -a "${1}" != "-c" ; then 
  302.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmdelete.c'\"
  303. else
  304. echo shar: Extracting \"'b+tree/btdbmlib/btdbmdelete.c'\" \(853 characters\)
  305. sed "s/^X//" >'b+tree/btdbmlib/btdbmdelete.c' <<'END_OF_FILE'
  306. X#include    <sys/types.h>
  307. X#include    <btdbm.h>
  308. X
  309. X
  310. X/*
  311. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  312. X                    All rights reserved
  313. X
  314. X
  315. X          This software, its documentation,  and  supporting
  316. X          files  are  copyrighted  material  and may only be
  317. X          distributed in accordance with the terms listed in
  318. X          the COPYRIGHT document.
  319. X*/
  320. X
  321. X
  322. X#ifndef    lint
  323. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmdelete.c,v 1.1 89/10/24 10:09:10 mjr Rel $";
  324. X#endif
  325. X
  326. X
  327. Xbtdbm_delete(db,key)
  328. XBTDBM    *db;
  329. Xbtdatum    key;
  330. X{
  331. X    off_t    orrv;
  332. X
  333. X    btdbm_error(db) = 1;
  334. X    if(bt_find(db->bt,key.dptr,key.dsize,&orrv) == BT_NF)
  335. X        return(1);
  336. X
  337. X    /* free the record */
  338. X    if(store_free(db->st,orrv) == STO_ERR)
  339. X        return(1);
  340. X
  341. X    /* clob the key */
  342. X    if(bt_delete(db->bt,key.dptr,key.dsize) != BT_OK)
  343. X        return(1);
  344. X
  345. X    btdbm_clearerror(db);
  346. X    return(0);
  347. X}
  348. END_OF_FILE
  349. if test 853 -ne `wc -c <'b+tree/btdbmlib/btdbmdelete.c'`; then
  350.     echo shar: \"'b+tree/btdbmlib/btdbmdelete.c'\" unpacked with wrong size!
  351. fi
  352. # end of 'b+tree/btdbmlib/btdbmdelete.c'
  353. fi
  354. if test -f 'b+tree/btdbmlib/btdbmfetch.c' -a "${1}" != "-c" ; then 
  355.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmfetch.c'\"
  356. else
  357. echo shar: Extracting \"'b+tree/btdbmlib/btdbmfetch.c'\" \(1333 characters\)
  358. sed "s/^X//" >'b+tree/btdbmlib/btdbmfetch.c' <<'END_OF_FILE'
  359. X#include    <sys/types.h>
  360. X#include    <btdbm.h>
  361. X
  362. X
  363. X/*
  364. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  365. X                    All rights reserved
  366. X
  367. X
  368. X          This software, its documentation,  and  supporting
  369. X          files  are  copyrighted  material  and may only be
  370. X          distributed in accordance with the terms listed in
  371. X          the COPYRIGHT document.
  372. X*/
  373. X
  374. X
  375. X#ifndef    lint
  376. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmfetch.c,v 1.1 89/10/24 10:09:10 mjr Rel $";
  377. X#endif
  378. X
  379. X
  380. Xbtdatum
  381. Xbtdbm_fetch(db,key)
  382. XBTDBM    *db;
  383. Xbtdatum    key;
  384. X{
  385. X    off_t    orrv;
  386. X    static    btdatum    ret;
  387. X    struct    sto_hdr    hd;
  388. X
  389. X    if(bt_find(db->bt,key.dptr,key.dsize,&orrv) == BT_NF)
  390. X        goto bombout;
  391. X
  392. X    /* OK - found a record */
  393. X    /* 1) read its header info to see if it will fit in the buffer */
  394. X    if(store_gethdr(db->st,orrv,&hd) == STO_ERR)
  395. X        goto bombout;
  396. X
  397. X    /* 2) if the internal buffer is not big enough, stretch it */
  398. X    if(store_bufsiz(db->st) < hd.used)
  399. X        if(store_reallocbuf(db->st,hd.used) == STO_ERR)
  400. X            goto bombout;
  401. X
  402. X    /* 3) read the stuff into the buffer and return it */
  403. X    if(store_read(db->st,orrv,0L,store_buffer(db->st),store_bufsiz(db->st),&ret.dsize) != STO_OK)
  404. X        goto bombout;
  405. X
  406. X    ret.dptr = (bt_chrp)store_buffer(db->st);
  407. X
  408. X    btdbm_clearerror(db);
  409. X    return(ret);
  410. X
  411. Xbombout:
  412. X    ret.dptr = 0;
  413. X    ret.dsize = 0;
  414. X    btdbm_error(db) = 1;
  415. X    return(ret);
  416. X}
  417. END_OF_FILE
  418. if test 1333 -ne `wc -c <'b+tree/btdbmlib/btdbmfetch.c'`; then
  419.     echo shar: \"'b+tree/btdbmlib/btdbmfetch.c'\" unpacked with wrong size!
  420. fi
  421. # end of 'b+tree/btdbmlib/btdbmfetch.c'
  422. fi
  423. if test -f 'b+tree/btdbmlib/btdbmfirstkey.c' -a "${1}" != "-c" ; then 
  424.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmfirstkey.c'\"
  425. else
  426. echo shar: Extracting \"'b+tree/btdbmlib/btdbmfirstkey.c'\" \(723 characters\)
  427. sed "s/^X//" >'b+tree/btdbmlib/btdbmfirstkey.c' <<'END_OF_FILE'
  428. X#include    <sys/types.h>
  429. X#include    <btdbm.h>
  430. X
  431. X
  432. X/*
  433. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  434. X                    All rights reserved
  435. X
  436. X
  437. X          This software, its documentation,  and  supporting
  438. X          files  are  copyrighted  material  and may only be
  439. X          distributed in accordance with the terms listed in
  440. X          the COPYRIGHT document.
  441. X*/
  442. X
  443. X
  444. X#ifndef    lint
  445. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmfirstkey.c,v 1.1 89/10/24 10:09:11 mjr Rel $";
  446. X#endif
  447. X
  448. X
  449. Xbtdatum
  450. Xbtdbm_firstkey(db)
  451. XBTDBM    *db;
  452. X{
  453. X    static    btdatum    ret;
  454. X
  455. X    btdbm_error(db) = 1;
  456. X    if(bt_goto(db->bt,BT_BOF) == BT_ERR) {
  457. X        ret.dptr = 0;
  458. X        ret.dsize = 0;
  459. X        return(ret);
  460. X    }
  461. X    
  462. X    ret = btdbm_nextkey(db);
  463. X    return(ret);
  464. X}
  465. END_OF_FILE
  466. if test 723 -ne `wc -c <'b+tree/btdbmlib/btdbmfirstkey.c'`; then
  467.     echo shar: \"'b+tree/btdbmlib/btdbmfirstkey.c'\" unpacked with wrong size!
  468. fi
  469. # end of 'b+tree/btdbmlib/btdbmfirstkey.c'
  470. fi
  471. if test -f 'b+tree/btdbmlib/btdbmnextkey.c' -a "${1}" != "-c" ; then 
  472.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmnextkey.c'\"
  473. else
  474. echo shar: Extracting \"'b+tree/btdbmlib/btdbmnextkey.c'\" \(965 characters\)
  475. sed "s/^X//" >'b+tree/btdbmlib/btdbmnextkey.c' <<'END_OF_FILE'
  476. X#include    <sys/types.h>
  477. X#include    <btdbm.h>
  478. X
  479. X
  480. X/*
  481. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  482. X                    All rights reserved
  483. X
  484. X
  485. X          This software, its documentation,  and  supporting
  486. X          files  are  copyrighted  material  and may only be
  487. X          distributed in accordance with the terms listed in
  488. X          the COPYRIGHT document.
  489. X*/
  490. X
  491. X
  492. X#ifndef    lint
  493. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmnextkey.c,v 1.1 89/10/24 10:09:11 mjr Rel $";
  494. X#endif
  495. X
  496. X
  497. Xbtdatum
  498. Xbtdbm_nextkey(db)
  499. XBTDBM    *db;
  500. X{
  501. X    static    btdatum    ret;
  502. X    off_t    rrv;
  503. X    int    r;
  504. X
  505. X    r = bt_traverse(db->bt,BT_EOF,store_buffer(db->st),store_bufsiz(db->st),&ret.dsize,&rrv);
  506. X    if(r == BT_ERR)
  507. X        goto bombout;
  508. X
  509. X    if(r == BT_EOF) {
  510. X        ret.dptr = 0;
  511. X        ret.dsize = 0;
  512. X        btdbm_clearerror(db);
  513. X        return(ret);
  514. X    }
  515. X    
  516. X    ret.dptr = (bt_chrp)store_buffer(db->st);
  517. X
  518. X    btdbm_clearerror(db);
  519. X    return(ret);
  520. X
  521. Xbombout:
  522. X    ret.dptr = 0;
  523. X    ret.dsize = 0;
  524. X    btdbm_error(db) = 1;
  525. X    return(ret);
  526. X}
  527. END_OF_FILE
  528. if test 965 -ne `wc -c <'b+tree/btdbmlib/btdbmnextkey.c'`; then
  529.     echo shar: \"'b+tree/btdbmlib/btdbmnextkey.c'\" unpacked with wrong size!
  530. fi
  531. # end of 'b+tree/btdbmlib/btdbmnextkey.c'
  532. fi
  533. if test -f 'b+tree/btdbmlib/btdbmopen.c' -a "${1}" != "-c" ; then 
  534.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmopen.c'\"
  535. else
  536. echo shar: Extracting \"'b+tree/btdbmlib/btdbmopen.c'\" \(1192 characters\)
  537. sed "s/^X//" >'b+tree/btdbmlib/btdbmopen.c' <<'END_OF_FILE'
  538. X#include    <stdio.h>
  539. X#include    <sys/types.h>
  540. X#include    <btdbm.h>
  541. X
  542. X
  543. X/*
  544. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  545. X                    All rights reserved
  546. X
  547. X
  548. X          This software, its documentation,  and  supporting
  549. X          files  are  copyrighted  material  and may only be
  550. X          distributed in accordance with the terms listed in
  551. X          the COPYRIGHT document.
  552. X*/
  553. X
  554. X
  555. X#ifndef    lint
  556. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmopen.c,v 1.1 89/10/24 10:09:12 mjr Rel $";
  557. X#endif
  558. X
  559. X
  560. Xextern    char    *malloc();
  561. Xextern    char    *strcat();
  562. Xextern    char    *strcpy();
  563. X
  564. XBTDBM    *
  565. Xbtdbm_open(path,type,flags,mode)
  566. Xchar    *path;
  567. Xint    type;
  568. Xint    flags;
  569. Xint    mode;
  570. X{
  571. X    BTDBM    *ret;
  572. X    char    nbuf[BUFSIZ];
  573. X
  574. X    if((ret = (BTDBM *)malloc(sizeof(BTDBM))) == NULL)
  575. X        return(NULL);
  576. X
  577. X    (void)strcpy(nbuf,path);
  578. X    (void)strcat(nbuf,".ndx");
  579. X
  580. X    if((ret->bt = bt_optopen(    BT_PATH,    nbuf,
  581. X                    BT_DTYPE,    type,
  582. X                    BT_OMODE,    flags,
  583. X                    BT_OPERM,    mode,
  584. X        0)) == NULL)
  585. X            goto bombout;
  586. X
  587. X    (void)strcpy(nbuf,path);
  588. X    (void)strcat(nbuf,".dat");
  589. X
  590. X    if((ret->st = store_open(nbuf,flags,mode)) == NULL)
  591. X        goto bombout;
  592. X
  593. X    /* OK */
  594. X    btdbm_clearerror(ret);
  595. X    return(ret);
  596. X
  597. Xbombout:
  598. X    free((char *)ret);
  599. X    return(NULL);
  600. X}
  601. END_OF_FILE
  602. if test 1192 -ne `wc -c <'b+tree/btdbmlib/btdbmopen.c'`; then
  603.     echo shar: \"'b+tree/btdbmlib/btdbmopen.c'\" unpacked with wrong size!
  604. fi
  605. # end of 'b+tree/btdbmlib/btdbmopen.c'
  606. fi
  607. if test -f 'b+tree/btdbmlib/btdbmstore.c' -a "${1}" != "-c" ; then 
  608.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/btdbmstore.c'\"
  609. else
  610. echo shar: Extracting \"'b+tree/btdbmlib/btdbmstore.c'\" \(1217 characters\)
  611. sed "s/^X//" >'b+tree/btdbmlib/btdbmstore.c' <<'END_OF_FILE'
  612. X#include    <sys/types.h>
  613. X#include    <btdbm.h>
  614. X
  615. X
  616. X/*
  617. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  618. X                    All rights reserved
  619. X
  620. X
  621. X          This software, its documentation,  and  supporting
  622. X          files  are  copyrighted  material  and may only be
  623. X          distributed in accordance with the terms listed in
  624. X          the COPYRIGHT document.
  625. X*/
  626. X
  627. X
  628. X#ifndef    lint
  629. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/btdbmstore.c,v 1.1 89/10/24 10:09:12 mjr Rel $";
  630. X#endif
  631. X
  632. X
  633. Xbtdbm_store(db,key,data,flag)
  634. XBTDBM    *db;
  635. Xbtdatum    key;
  636. Xbtdatum    data;
  637. Xint    flag;
  638. X{
  639. X    off_t    orrv;
  640. X
  641. X    btdbm_error(db) = 1;
  642. X    if(bt_find(db->bt,key.dptr,key.dsize,&orrv) != BT_NF) {
  643. X        if(flag == BTDBM_INSERT) {
  644. X            return(1);
  645. X        } else {
  646. X            /* free old stored record */
  647. X            if(store_free(db->st,orrv) == STO_ERR)
  648. X                return(1);
  649. X        }
  650. X    }
  651. X
  652. X    /* allocate new record */
  653. X    if((orrv = store_alloc(db->st,data.dsize)) == STO_ERR)
  654. X        return(1);
  655. X
  656. X    /* copy data into new record */
  657. X    if(store_write(db->st,orrv,0L,data.dptr,data.dsize) == STO_ERR)
  658. X        return(1);
  659. X
  660. X    /* update pointer in the b+tree - ok at this point to just replace */
  661. X    if(bt_insert(db->bt,key.dptr,key.dsize,orrv,1) == BT_ERR)
  662. X        return(1);
  663. X
  664. X    btdbm_clearerror(db);
  665. X    return(0);        
  666. X}
  667. END_OF_FILE
  668. if test 1217 -ne `wc -c <'b+tree/btdbmlib/btdbmstore.c'`; then
  669.     echo shar: \"'b+tree/btdbmlib/btdbmstore.c'\" unpacked with wrong size!
  670. fi
  671. # end of 'b+tree/btdbmlib/btdbmstore.c'
  672. fi
  673. if test -f 'b+tree/btdbmlib/stclose.c' -a "${1}" != "-c" ; then 
  674.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stclose.c'\"
  675. else
  676. echo shar: Extracting \"'b+tree/btdbmlib/stclose.c'\" \(787 characters\)
  677. sed "s/^X//" >'b+tree/btdbmlib/stclose.c' <<'END_OF_FILE'
  678. X#include    <stdio.h>
  679. X#include    <sys/types.h>
  680. X#include    "stoconf.h"
  681. X#include    "store.h"
  682. X
  683. X
  684. X/*
  685. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  686. X                    All rights reserved
  687. X
  688. X
  689. X          This software, its documentation,  and  supporting
  690. X          files  are  copyrighted  material  and may only be
  691. X          distributed in accordance with the terms listed in
  692. X          the COPYRIGHT document.
  693. X*/
  694. X
  695. X
  696. X#ifndef    lint
  697. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stclose.c,v 1.1 89/10/24 10:09:13 mjr Rel $";
  698. X#endif
  699. X
  700. X/*
  701. X    close a store file and deallocate any buffers, etc
  702. X*/
  703. X
  704. Xstore_close(r)
  705. XSTORE    *r;
  706. X{
  707. X    int    rv = STO_OK;
  708. X
  709. X    if(close(store_fileno(r)) != 0)
  710. X        rv = STO_ERR;
  711. X
  712. X    if(store_buffer(r) != NULL)
  713. X        free((char *)store_buffer(r));
  714. X    free((char *)r);
  715. X    return(rv);
  716. X}
  717. END_OF_FILE
  718. if test 787 -ne `wc -c <'b+tree/btdbmlib/stclose.c'`; then
  719.     echo shar: \"'b+tree/btdbmlib/stclose.c'\" unpacked with wrong size!
  720. fi
  721. # end of 'b+tree/btdbmlib/stclose.c'
  722. fi
  723. if test -f 'b+tree/btdbmlib/stcopy.c' -a "${1}" != "-c" ; then 
  724.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stcopy.c'\"
  725. else
  726. echo shar: Extracting \"'b+tree/btdbmlib/stcopy.c'\" \(1260 characters\)
  727. sed "s/^X//" >'b+tree/btdbmlib/stcopy.c' <<'END_OF_FILE'
  728. X#include    <sys/types.h>
  729. X#include    "stoconf.h"
  730. X#include    "store.h"
  731. X
  732. X
  733. X/*
  734. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  735. X                    All rights reserved
  736. X
  737. X
  738. X          This software, its documentation,  and  supporting
  739. X          files  are  copyrighted  material  and may only be
  740. X          distributed in accordance with the terms listed in
  741. X          the COPYRIGHT document.
  742. X*/
  743. X
  744. X
  745. X#ifndef    lint
  746. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stcopy.c,v 1.1 89/10/24 10:09:13 mjr Rel $";
  747. X#endif
  748. X
  749. X/*
  750. X    make a copy of a record. returns an error if there is not enough
  751. X    space for the copy. otherwise it will read and write buffers as
  752. X    necessary to copy the entire IN-USE portion of a record. bytes
  753. X    that are not in-use are not copied, which allows records to be
  754. X    "shrunk" in this manner.
  755. X*/
  756. X
  757. Xstore_copy(r,rec1,rec2)
  758. XSTORE    *r;
  759. Xsto_ptr        rec1;
  760. Xsto_ptr        rec2;
  761. X{
  762. X    off_t    currof = 0L;
  763. X
  764. X    if(rec1 == rec2)
  765. X        return(STO_OK);
  766. X
  767. X    while(1) {
  768. X        int    ismore;
  769. X        int    byts;
  770. X
  771. X        ismore = store_read(r,rec1,currof,store_buffer(r),store_bufsiz(r),&byts);
  772. X        if(ismore == STO_ERR)
  773. X            return(STO_ERR);
  774. X
  775. X        if(store_write(r,rec2,currof,store_buffer(r),byts) == STO_ERR)
  776. X            return(STO_ERR);
  777. X
  778. X        currof += (off_t)byts;
  779. X
  780. X        if(ismore == STO_OK)
  781. X            break;
  782. X    }
  783. X    return(STO_OK);
  784. X}
  785. END_OF_FILE
  786. if test 1260 -ne `wc -c <'b+tree/btdbmlib/stcopy.c'`; then
  787.     echo shar: \"'b+tree/btdbmlib/stcopy.c'\" unpacked with wrong size!
  788. fi
  789. # end of 'b+tree/btdbmlib/stcopy.c'
  790. fi
  791. if test -f 'b+tree/btdbmlib/stdecref.c' -a "${1}" != "-c" ; then 
  792.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stdecref.c'\"
  793. else
  794. echo shar: Extracting \"'b+tree/btdbmlib/stdecref.c'\" \(804 characters\)
  795. sed "s/^X//" >'b+tree/btdbmlib/stdecref.c' <<'END_OF_FILE'
  796. X#include    <sys/types.h>
  797. X#include    "stoconf.h"
  798. X#include    "store.h"
  799. X
  800. X
  801. X/*
  802. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  803. X                    All rights reserved
  804. X
  805. X
  806. X          This software, its documentation,  and  supporting
  807. X          files  are  copyrighted  material  and may only be
  808. X          distributed in accordance with the terms listed in
  809. X          the COPYRIGHT document.
  810. X*/
  811. X
  812. X
  813. X#ifndef    lint
  814. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stdecref.c,v 1.1 89/10/24 10:09:13 mjr Rel $";
  815. X#endif
  816. X
  817. X/*
  818. X    decrement the reference count in a record header.
  819. X*/
  820. X
  821. Xstore_decrefcnt(r,rec)
  822. XSTORE    *r;
  823. Xsto_ptr        rec;
  824. X{
  825. X    struct    sto_hdr     rbuf;
  826. X    if(store_gethdr(r,rec,&rbuf) == STO_ERR)
  827. X        return(STO_ERR);
  828. X    rbuf.refs--;
  829. X    if(store_puthdr(r,rec,&rbuf) == STO_ERR)
  830. X        return(STO_ERR);
  831. X    return(STO_OK);
  832. X}
  833. END_OF_FILE
  834. if test 804 -ne `wc -c <'b+tree/btdbmlib/stdecref.c'`; then
  835.     echo shar: \"'b+tree/btdbmlib/stdecref.c'\" unpacked with wrong size!
  836. fi
  837. # end of 'b+tree/btdbmlib/stdecref.c'
  838. fi
  839. if test -f 'b+tree/btdbmlib/sterrs.c' -a "${1}" != "-c" ; then 
  840.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/sterrs.c'\"
  841. else
  842. echo shar: Extracting \"'b+tree/btdbmlib/sterrs.c'\" \(1342 characters\)
  843. sed "s/^X//" >'b+tree/btdbmlib/sterrs.c' <<'END_OF_FILE'
  844. X#include    <stdio.h>
  845. X#include    <sys/types.h>
  846. X#include    "stoconf.h"
  847. X#include    "store.h"
  848. X
  849. X
  850. X/*
  851. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  852. X                    All rights reserved
  853. X
  854. X
  855. X          This software, its documentation,  and  supporting
  856. X          files  are  copyrighted  material  and may only be
  857. X          distributed in accordance with the terms listed in
  858. X          the COPYRIGHT document.
  859. X*/
  860. X
  861. X
  862. X#ifndef    lint
  863. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/sterrs.c,v 1.1 89/10/24 10:09:14 mjr Rel $";
  864. X#endif
  865. X
  866. X/*
  867. X    error strings and a perror() like routine.
  868. X*/
  869. X
  870. Xextern    int    errno;
  871. X
  872. Xchar    *sto_errs[] = {
  873. X/* STO_NOERROR */        "no record error",
  874. X/* STO_BADHDR */        "bad record header",
  875. X/* STO_IOERR */            "record I/O error",
  876. X/* STO_NOSTO */            "no such record",
  877. X/* STO_TOOSMALL */        "record too small",
  878. X0};
  879. X
  880. X
  881. Xvoid
  882. Xstore_perror(r,s)
  883. XSTORE    *r;
  884. Xchar        *s;
  885. X{
  886. X    static    char    *cmesg = "cannot open";
  887. X    static    char    *fmt1 = "%s\n";
  888. X    static    char    *fmt2 = "%s: %s\n";
  889. X
  890. X    if(r == NULL) {
  891. X        if(s == NULL || *s == '\0')
  892. X            (void)fprintf(stderr,fmt1,cmesg);
  893. X        else
  894. X            (void)fprintf(stderr,fmt2,s,cmesg);
  895. X        return;
  896. X    }
  897. X    if(store_errno(r) == STO_NOERROR && errno != 0) {
  898. X        perror(s);
  899. X    } else {
  900. X        if(s == NULL || *s == '\0')
  901. X            (void)fprintf(stderr,fmt1,sto_errs[store_errno(r)]);
  902. X        else
  903. X            (void)fprintf(stderr,fmt2,s,sto_errs[store_errno(r)]);
  904. X    }
  905. X}
  906. END_OF_FILE
  907. if test 1342 -ne `wc -c <'b+tree/btdbmlib/sterrs.c'`; then
  908.     echo shar: \"'b+tree/btdbmlib/sterrs.c'\" unpacked with wrong size!
  909. fi
  910. # end of 'b+tree/btdbmlib/sterrs.c'
  911. fi
  912. if test -f 'b+tree/btdbmlib/stgethed.c' -a "${1}" != "-c" ; then 
  913.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stgethed.c'\"
  914. else
  915. echo shar: Extracting \"'b+tree/btdbmlib/stgethed.c'\" \(1468 characters\)
  916. sed "s/^X//" >'b+tree/btdbmlib/stgethed.c' <<'END_OF_FILE'
  917. X#include    <sys/types.h>
  918. X#include    "stoconf.h"
  919. X#include    "store.h"
  920. X#include    "stointern.h"
  921. X
  922. X
  923. X/*
  924. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  925. X                    All rights reserved
  926. X
  927. X
  928. X          This software, its documentation,  and  supporting
  929. X          files  are  copyrighted  material  and may only be
  930. X          distributed in accordance with the terms listed in
  931. X          the COPYRIGHT document.
  932. X*/
  933. X
  934. X
  935. X#ifndef    lint
  936. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stgethed.c,v 1.1 89/10/24 10:09:15 mjr Rel $";
  937. X#endif
  938. X
  939. X/*
  940. X    read a record header. this might benefit from some caching,
  941. X    because this function is called A LOT. a record header is
  942. X    read, then checked (as much as we can - using a magic number)
  943. X    for validity. note that the file descriptor should be left
  944. X    pointing to the beginning of the record's data segment. the
  945. X    functions store_read() and store_write() rely on this.
  946. X*/
  947. X
  948. Xextern    off_t    lseek();
  949. X
  950. Xstore_gethdr(r,rec,hdr)
  951. XSTORE    *r;
  952. Xsto_ptr        rec;
  953. Xstruct    sto_hdr        *hdr;
  954. X{
  955. X    if(rec == STO_NULL) {
  956. X        store_errno(r) = STO_NOREC;
  957. X        return(STO_ERR);
  958. X    }
  959. X
  960. X    if(lseek(store_fileno(r),rec,SEEK_SET) != rec) {
  961. X        store_errno(r) = STO_IOERR;
  962. X        return(STO_ERR);
  963. X    }
  964. X
  965. X    switch(read(store_fileno(r),(char *)hdr,STO_HSIZ)) {
  966. X        case    0:
  967. X            store_errno(r) = STO_NOREC;
  968. X            return(STO_ERR);
  969. X
  970. X        case    STO_HSIZ:
  971. X            if(hdr->magic != STO_DFLTMAGIC) {
  972. X                store_errno(r) = STO_NOREC;
  973. X                return(STO_ERR);
  974. X            }
  975. X            return(STO_OK);
  976. X
  977. X        default:
  978. X            return(STO_ERR);
  979. X    }
  980. X
  981. X}
  982. END_OF_FILE
  983. if test 1468 -ne `wc -c <'b+tree/btdbmlib/stgethed.c'`; then
  984.     echo shar: \"'b+tree/btdbmlib/stgethed.c'\" unpacked with wrong size!
  985. fi
  986. # end of 'b+tree/btdbmlib/stgethed.c'
  987. fi
  988. if test -f 'b+tree/btdbmlib/stincref.c' -a "${1}" != "-c" ; then 
  989.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stincref.c'\"
  990. else
  991. echo shar: Extracting \"'b+tree/btdbmlib/stincref.c'\" \(798 characters\)
  992. sed "s/^X//" >'b+tree/btdbmlib/stincref.c' <<'END_OF_FILE'
  993. X#include    <sys/types.h>
  994. X#include    "stoconf.h"
  995. X#include    "store.h"
  996. X
  997. X
  998. X/*
  999. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1000. X                    All rights reserved
  1001. X
  1002. X
  1003. X          This software, its documentation,  and  supporting
  1004. X          files  are  copyrighted  material  and may only be
  1005. X          distributed in accordance with the terms listed in
  1006. X          the COPYRIGHT document.
  1007. X*/
  1008. X
  1009. X
  1010. X#ifndef    lint
  1011. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stincref.c,v 1.1 89/10/24 10:09:15 mjr Rel $";
  1012. X#endif
  1013. X
  1014. X/*
  1015. X    increment a reference counter in the header
  1016. X*/
  1017. X
  1018. Xstore_increfcnt(r,rec)
  1019. XSTORE    *r;
  1020. Xsto_ptr        rec;
  1021. X{
  1022. X    struct    sto_hdr     rbuf;
  1023. X    if(store_gethdr(r,rec,&rbuf) == STO_ERR)
  1024. X        return(STO_ERR);
  1025. X    rbuf.refs++;
  1026. X    if(store_puthdr(r,rec,&rbuf) == STO_ERR)
  1027. X        return(STO_ERR);
  1028. X    return(STO_OK);
  1029. X}
  1030. END_OF_FILE
  1031. if test 798 -ne `wc -c <'b+tree/btdbmlib/stincref.c'`; then
  1032.     echo shar: \"'b+tree/btdbmlib/stincref.c'\" unpacked with wrong size!
  1033. fi
  1034. # end of 'b+tree/btdbmlib/stincref.c'
  1035. fi
  1036. if test -f 'b+tree/btdbmlib/stlinka.c' -a "${1}" != "-c" ; then 
  1037.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stlinka.c'\"
  1038. else
  1039. echo shar: Extracting \"'b+tree/btdbmlib/stlinka.c'\" \(1609 characters\)
  1040. sed "s/^X//" >'b+tree/btdbmlib/stlinka.c' <<'END_OF_FILE'
  1041. X#include    <sys/types.h>
  1042. X#include    "stoconf.h"
  1043. X#include    "store.h"
  1044. X
  1045. X
  1046. X/*
  1047. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1048. X                    All rights reserved
  1049. X
  1050. X
  1051. X          This software, its documentation,  and  supporting
  1052. X          files  are  copyrighted  material  and may only be
  1053. X          distributed in accordance with the terms listed in
  1054. X          the COPYRIGHT document.
  1055. X*/
  1056. X
  1057. X
  1058. X#ifndef    lint
  1059. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stlinka.c,v 1.1 89/10/24 10:09:15 mjr Rel $";
  1060. X#endif
  1061. X
  1062. X/*
  1063. X    manipulate the link pointers of a header to link the record numbered
  1064. X    'pred' AFTER the record numbered 'victim'. Note that no attempt is
  1065. X    made to UNLINK the victim if it is already linked into a list.
  1066. X    that must be controlled at a higher level, or we get into a kind
  1067. X    of recursive linking and unlinking loop and never return.
  1068. X*/
  1069. X
  1070. Xstore_linkafter(r,victim,pred)
  1071. XSTORE    *r;
  1072. Xsto_ptr        victim;
  1073. Xsto_ptr        pred;
  1074. X{
  1075. X    struct    sto_hdr     nbuf;
  1076. X    struct    sto_hdr     pbuf;
  1077. X    struct    sto_hdr     vbuf;
  1078. X    char    nnul = 0;
  1079. X
  1080. X    if(pred == STO_NULL) {
  1081. X        store_errno(r) = STO_NOREC;
  1082. X        return(STO_ERR);
  1083. X    }
  1084. X
  1085. X    if(store_gethdr(r,victim,&vbuf) == STO_ERR || store_gethdr(r,pred,&pbuf) == STO_ERR)
  1086. X        return(STO_ERR);
  1087. X
  1088. X    if(pbuf.next != STO_NULL)
  1089. X        nnul++;
  1090. X
  1091. X    if(nnul && store_gethdr(r,pbuf.next,&nbuf) == STO_ERR)
  1092. X        return(STO_ERR);
  1093. X
  1094. X    if(nnul)
  1095. X        nbuf.prev = victim;
  1096. X
  1097. X    vbuf.prev = pred;
  1098. X    vbuf.next = pbuf.next;
  1099. X    pbuf.next = victim;
  1100. X
  1101. X    if(store_puthdr(r,victim,&vbuf) == STO_ERR || store_puthdr(r,pred,&pbuf) == STO_ERR)
  1102. X        return(STO_ERR);
  1103. X
  1104. X    if(nnul && store_puthdr(r,vbuf.next,&nbuf) == STO_ERR)
  1105. X        return(STO_ERR);
  1106. X
  1107. X    return(STO_OK);
  1108. X}
  1109. END_OF_FILE
  1110. if test 1609 -ne `wc -c <'b+tree/btdbmlib/stlinka.c'`; then
  1111.     echo shar: \"'b+tree/btdbmlib/stlinka.c'\" unpacked with wrong size!
  1112. fi
  1113. # end of 'b+tree/btdbmlib/stlinka.c'
  1114. fi
  1115. if test -f 'b+tree/btdbmlib/stoconf.h' -a "${1}" != "-c" ; then 
  1116.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stoconf.h'\"
  1117. else
  1118. echo shar: Extracting \"'b+tree/btdbmlib/stoconf.h'\" \(946 characters\)
  1119. sed "s/^X//" >'b+tree/btdbmlib/stoconf.h' <<'END_OF_FILE'
  1120. X#ifndef    _DEF_STO_CONF_H
  1121. X
  1122. X/*
  1123. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1124. X                    All rights reserved
  1125. X
  1126. X
  1127. X          This software, its documentation,  and  supporting
  1128. X          files  are  copyrighted  material  and may only be
  1129. X          distributed in accordance with the terms listed in
  1130. X          the COPYRIGHT document.
  1131. X*/
  1132. X
  1133. X
  1134. X/*
  1135. X    $Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stoconf.h,v 1.1 89/10/24 10:09:20 mjr Rel $
  1136. X
  1137. X    THIS SHOULD NOT BE INCLUDED BY USER-LEVEL PROGRAMS
  1138. X
  1139. X    All reasonably user-configurable options are in this file.
  1140. X
  1141. X    If there is something that needs to be special-cased for
  1142. X    a system, put it here, PLEASE!
  1143. X*/
  1144. X
  1145. X
  1146. X/*
  1147. Xdefault magic number to use for a record store file
  1148. X*/
  1149. X#define    STO_DFLTMAGIC    0x72252
  1150. X
  1151. X
  1152. X/*
  1153. XSEEK_SET should be whatever your systems version of lseek() takes
  1154. Xto tell it to go to an exact offset. zero is pretty standard.
  1155. X*/
  1156. X#ifndef    SEEK_SET
  1157. X#define    SEEK_SET    0
  1158. X#endif
  1159. X
  1160. X#define    _DEF_STO_CONF_H
  1161. X#endif
  1162. END_OF_FILE
  1163. if test 946 -ne `wc -c <'b+tree/btdbmlib/stoconf.h'`; then
  1164.     echo shar: \"'b+tree/btdbmlib/stoconf.h'\" unpacked with wrong size!
  1165. fi
  1166. # end of 'b+tree/btdbmlib/stoconf.h'
  1167. fi
  1168. if test -f 'b+tree/btdbmlib/stointern.h' -a "${1}" != "-c" ; then 
  1169.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stointern.h'\"
  1170. else
  1171. echo shar: Extracting \"'b+tree/btdbmlib/stointern.h'\" \(1431 characters\)
  1172. sed "s/^X//" >'b+tree/btdbmlib/stointern.h' <<'END_OF_FILE'
  1173. X#ifndef    _DEF_STO_INTERN_H
  1174. X
  1175. X/*
  1176. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1177. X                    All rights reserved
  1178. X
  1179. X
  1180. X          This software, its documentation,  and  supporting
  1181. X          files  are  copyrighted  material  and may only be
  1182. X          distributed in accordance with the terms listed in
  1183. X          the COPYRIGHT document.
  1184. X*/
  1185. X
  1186. X
  1187. X/*
  1188. X    $Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stointern.h,v 1.1 89/10/24 10:09:21 mjr Rel $
  1189. X    THIS SHOULD NOT BE INCLUDED BY USER-LEVEL PROGRAMS
  1190. X*/
  1191. X
  1192. X
  1193. X/*
  1194. X    macros to control the layout of a free list buffer
  1195. X*/
  1196. Xstruct    sto_freeent {
  1197. X    sto_ptr    addr;
  1198. X    int    size;
  1199. X};
  1200. X
  1201. X/* the next free list buffer in chain */
  1202. X#define    STO_FREENXT(b)    (*(off_t *)(b))
  1203. X
  1204. X/* the number of free list entries in this buffer */
  1205. X#define    STO_FREECNT(b)    (*(int *)(b + sizeof(off_t)))
  1206. X
  1207. X/* the actual data area - note this is inherently aligned to an off_t */
  1208. X#define    STO_FREEBUF(b)    ((struct sto_freeent *)(b + (2 * sizeof(off_t))))
  1209. X
  1210. X/* size of a record header, for the sake of abberviation */
  1211. X#define    STO_HSIZ    (sizeof(struct sto_hdr))
  1212. X
  1213. X/* size of a freelist entry, for the sake of abberviation */
  1214. X#define    STO_FSIZ    (sizeof(struct sto_freeent))
  1215. X
  1216. X/*
  1217. Xsize at which to start fragmenting records internally. If the record
  1218. Xcan be split, and have at least this much left, it will. Note that
  1219. Xthe remaining value MUST include room for a record header block
  1220. X*/
  1221. X#define    STO_SPLITSIZ    (265 + STO_HSIZ)
  1222. X
  1223. X#define    _DEF_STO_INTERN_H
  1224. X#endif
  1225. END_OF_FILE
  1226. if test 1431 -ne `wc -c <'b+tree/btdbmlib/stointern.h'`; then
  1227.     echo shar: \"'b+tree/btdbmlib/stointern.h'\" unpacked with wrong size!
  1228. fi
  1229. # end of 'b+tree/btdbmlib/stointern.h'
  1230. fi
  1231. if test -f 'b+tree/btdbmlib/stopen.c' -a "${1}" != "-c" ; then 
  1232.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stopen.c'\"
  1233. else
  1234. echo shar: Extracting \"'b+tree/btdbmlib/stopen.c'\" \(1552 characters\)
  1235. sed "s/^X//" >'b+tree/btdbmlib/stopen.c' <<'END_OF_FILE'
  1236. X#include    <stdio.h>
  1237. X#include    <sys/types.h>
  1238. X#include    <sys/file.h>
  1239. X#include    "stoconf.h"
  1240. X#include    "store.h"
  1241. X#include    "stointern.h"
  1242. X
  1243. X
  1244. X/*
  1245. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1246. X                    All rights reserved
  1247. X
  1248. X
  1249. X          This software, its documentation,  and  supporting
  1250. X          files  are  copyrighted  material  and may only be
  1251. X          distributed in accordance with the terms listed in
  1252. X          the COPYRIGHT document.
  1253. X*/
  1254. X
  1255. X
  1256. X#ifndef    lint
  1257. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stopen.c,v 1.1 89/10/24 10:09:16 mjr Rel $";
  1258. X#endif
  1259. X
  1260. X/*
  1261. X    open a store file and allocate all the buffers, etc.
  1262. X*/
  1263. X
  1264. Xextern    char    *malloc();
  1265. X
  1266. XSTORE    *
  1267. Xstore_open(path,flags,mode)
  1268. Xchar    *path;
  1269. Xint    flags;
  1270. Xint    mode;
  1271. X{
  1272. X    STORE    *ret;
  1273. X    int        r;
  1274. X
  1275. X    if((ret = (STORE *)malloc(sizeof(STORE))) == NULL)
  1276. X        return(NULL);
  1277. X
  1278. X    if((store_buffer(ret) = (unsigned char *)malloc((unsigned)STO_BUFSIZ)) == NULL)
  1279. X        return(NULL);
  1280. X    store_bufsiz(ret) = STO_BUFSIZ;
  1281. X
  1282. X    if((store_fileno(ret) = open(path,flags|O_RDWR,mode)) < 0)
  1283. X        goto bombout;
  1284. X
  1285. X    r = read(store_fileno(ret),(char *)&ret->sblk,sizeof(struct sto_sb));
  1286. X
  1287. X    /* initialize */
  1288. X    if(r == 0) {
  1289. X        ret->sblk.magic = STO_DFLTMAGIC;
  1290. X        ret->sblk.high = (off_t)sizeof(struct sto_sb);
  1291. X        ret->sblk.free = STO_NULL;
  1292. X        ret->sblk.label = STO_NULL;
  1293. X        if(store_wsuper(ret) != STO_OK)
  1294. X            goto bombout;
  1295. X    }
  1296. X
  1297. X    if(ret->sblk.magic != STO_DFLTMAGIC)
  1298. X        goto bombout;
  1299. X
  1300. X    ret->currec = STO_NULL;
  1301. X    ret->curlst = STO_NULL;
  1302. X
  1303. X    store_clearerr(ret);
  1304. X
  1305. X    /* all is well. */
  1306. X    return(ret);
  1307. X
  1308. X    bombout:
  1309. X        free((char *)ret);
  1310. X        return(NULL);
  1311. X}
  1312. END_OF_FILE
  1313. if test 1552 -ne `wc -c <'b+tree/btdbmlib/stopen.c'`; then
  1314.     echo shar: \"'b+tree/btdbmlib/stopen.c'\" unpacked with wrong size!
  1315. fi
  1316. # end of 'b+tree/btdbmlib/stopen.c'
  1317. fi
  1318. if test -f 'b+tree/btdbmlib/stputhed.c' -a "${1}" != "-c" ; then 
  1319.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stputhed.c'\"
  1320. else
  1321. echo shar: Extracting \"'b+tree/btdbmlib/stputhed.c'\" \(960 characters\)
  1322. sed "s/^X//" >'b+tree/btdbmlib/stputhed.c' <<'END_OF_FILE'
  1323. X#include    <sys/types.h>
  1324. X#include    "stoconf.h"
  1325. X#include    "store.h"
  1326. X#include    "stointern.h"
  1327. X
  1328. X
  1329. X/*
  1330. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1331. X                    All rights reserved
  1332. X
  1333. X
  1334. X          This software, its documentation,  and  supporting
  1335. X          files  are  copyrighted  material  and may only be
  1336. X          distributed in accordance with the terms listed in
  1337. X          the COPYRIGHT document.
  1338. X*/
  1339. X
  1340. X
  1341. X#ifndef    lint
  1342. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stputhed.c,v 1.1 89/10/24 10:09:17 mjr Rel $";
  1343. X#endif
  1344. X
  1345. X/*
  1346. X    update a record header. this function is also called a lot and
  1347. X    should be (maybe) made to cache and synchronise with store_gethdr().
  1348. X*/
  1349. X
  1350. Xextern    off_t    lseek();
  1351. X
  1352. Xstore_puthdr(r,rec,hdr)
  1353. XSTORE    *r;
  1354. Xsto_ptr        rec;
  1355. Xstruct    sto_hdr        *hdr;
  1356. X{
  1357. X    if(lseek(store_fileno(r),rec,SEEK_SET) != rec ||
  1358. X        write(store_fileno(r),(char *)hdr,STO_HSIZ) != STO_HSIZ) {
  1359. X        store_errno(r) = STO_IOERR;
  1360. X        return(STO_ERR);
  1361. X    }
  1362. X    return(STO_OK);
  1363. X}
  1364. END_OF_FILE
  1365. if test 960 -ne `wc -c <'b+tree/btdbmlib/stputhed.c'`; then
  1366.     echo shar: \"'b+tree/btdbmlib/stputhed.c'\" unpacked with wrong size!
  1367. fi
  1368. # end of 'b+tree/btdbmlib/stputhed.c'
  1369. fi
  1370. if test -f 'b+tree/btdbmlib/stread.c' -a "${1}" != "-c" ; then 
  1371.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stread.c'\"
  1372. else
  1373. echo shar: Extracting \"'b+tree/btdbmlib/stread.c'\" \(1414 characters\)
  1374. sed "s/^X//" >'b+tree/btdbmlib/stread.c' <<'END_OF_FILE'
  1375. X#include    <sys/types.h>
  1376. X#include    "stoconf.h"
  1377. X#include    "store.h"
  1378. X#include    "stointern.h"
  1379. X
  1380. X
  1381. X/*
  1382. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1383. X                    All rights reserved
  1384. X
  1385. X
  1386. X          This software, its documentation,  and  supporting
  1387. X          files  are  copyrighted  material  and may only be
  1388. X          distributed in accordance with the terms listed in
  1389. X          the COPYRIGHT document.
  1390. X*/
  1391. X
  1392. X
  1393. X#ifndef    lint
  1394. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stread.c,v 1.1 89/10/24 10:09:17 mjr Rel $";
  1395. X#endif
  1396. X
  1397. X/*
  1398. X    function to read a record into a user-provided buffer. it is somewhat
  1399. X    like the read(2) system call except it accepts an offset, and returns
  1400. X    the number of bytes read in an integer variable provided by the caller.
  1401. X*/
  1402. X
  1403. Xextern    off_t    lseek();
  1404. X
  1405. Xstore_read(r,rec,offset,buf,siz,rsiz)
  1406. XSTORE    *r;
  1407. Xsto_ptr        rec;
  1408. Xoff_t        offset;
  1409. Xunsigned char    *buf;
  1410. Xint        siz;
  1411. Xint        *rsiz;
  1412. X{
  1413. X    struct    sto_hdr    rbuf;
  1414. X    int    ret = STO_OK;
  1415. X    int    toread;
  1416. X
  1417. X    if(store_gethdr(r,rec,&rbuf) == STO_ERR)
  1418. X        return(STO_ERR);
  1419. X
  1420. X    if(rbuf.used > siz + offset)
  1421. X        ret = STO_MORE;
  1422. X
  1423. X    if(siz + offset > rbuf.used)
  1424. X        toread = rbuf.used - offset;
  1425. X    else
  1426. X        toread = siz;
  1427. X
  1428. X    if(offset > 0 && lseek(store_fileno(r),rec + STO_HSIZ + offset,SEEK_SET) != rec + STO_HSIZ + offset) {
  1429. X        store_errno(r) = STO_IOERR;
  1430. X        return(STO_ERR);
  1431. X    }
  1432. X
  1433. X    if((*rsiz = read(store_fileno(r),(char *)buf,toread)) != toread)
  1434. X        return(STO_ERR);
  1435. X    return(ret);
  1436. X}
  1437. END_OF_FILE
  1438. if test 1414 -ne `wc -c <'b+tree/btdbmlib/stread.c'`; then
  1439.     echo shar: \"'b+tree/btdbmlib/stread.c'\" unpacked with wrong size!
  1440. fi
  1441. # end of 'b+tree/btdbmlib/stread.c'
  1442. fi
  1443. if test -f 'b+tree/btdbmlib/streallocbuf.c' -a "${1}" != "-c" ; then 
  1444.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/streallocbuf.c'\"
  1445. else
  1446. echo shar: Extracting \"'b+tree/btdbmlib/streallocbuf.c'\" \(811 characters\)
  1447. sed "s/^X//" >'b+tree/btdbmlib/streallocbuf.c' <<'END_OF_FILE'
  1448. X#include    <stdio.h>
  1449. X#include    <sys/types.h>
  1450. X#include    "stoconf.h"
  1451. X#include    "store.h"
  1452. X#include    "stointern.h"
  1453. X
  1454. X
  1455. X/*
  1456. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1457. X                    All rights reserved
  1458. X
  1459. X
  1460. X          This software, its documentation,  and  supporting
  1461. X          files  are  copyrighted  material  and may only be
  1462. X          distributed in accordance with the terms listed in
  1463. X          the COPYRIGHT document.
  1464. X*/
  1465. X
  1466. X
  1467. X#ifndef    lint
  1468. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/streallocbuf.c,v 1.1 89/10/24 10:09:18 mjr Rel $";
  1469. X#endif
  1470. X
  1471. X
  1472. Xextern    char    *realloc();
  1473. X
  1474. Xstore_reallocbuf(r,siz)
  1475. XSTORE    *r;
  1476. Xint    siz;
  1477. X{
  1478. X    store_buffer(r) = (unsigned char *)realloc((char *)store_buffer(r),(unsigned)siz);
  1479. X    if(store_buffer(r) == NULL)
  1480. X        return(STO_ERR);
  1481. X    store_bufsiz(r) = siz;
  1482. X    return(STO_OK);
  1483. X}
  1484. END_OF_FILE
  1485. if test 811 -ne `wc -c <'b+tree/btdbmlib/streallocbuf.c'`; then
  1486.     echo shar: \"'b+tree/btdbmlib/streallocbuf.c'\" unpacked with wrong size!
  1487. fi
  1488. # end of 'b+tree/btdbmlib/streallocbuf.c'
  1489. fi
  1490. if test -f 'b+tree/btdbmlib/stunlink.c' -a "${1}" != "-c" ; then 
  1491.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stunlink.c'\"
  1492. else
  1493. echo shar: Extracting \"'b+tree/btdbmlib/stunlink.c'\" \(1457 characters\)
  1494. sed "s/^X//" >'b+tree/btdbmlib/stunlink.c' <<'END_OF_FILE'
  1495. X#include    <sys/types.h>
  1496. X#include    "stoconf.h"
  1497. X#include    "store.h"
  1498. X
  1499. X
  1500. X/*
  1501. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1502. X                    All rights reserved
  1503. X
  1504. X
  1505. X          This software, its documentation,  and  supporting
  1506. X          files  are  copyrighted  material  and may only be
  1507. X          distributed in accordance with the terms listed in
  1508. X          the COPYRIGHT document.
  1509. X*/
  1510. X
  1511. X
  1512. X#ifndef    lint
  1513. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stunlink.c,v 1.1 89/10/24 10:09:18 mjr Rel $";
  1514. X#endif
  1515. X
  1516. X/*
  1517. X    break the links on both sides of a record, making them point to
  1518. X    the correct places.
  1519. X*/
  1520. X
  1521. Xstore_unlink(r,victim)
  1522. XSTORE    *r;
  1523. Xsto_ptr        victim;
  1524. X{
  1525. X    struct    sto_hdr     pbuf;
  1526. X    struct    sto_hdr     nbuf;
  1527. X    struct    sto_hdr     vbuf;
  1528. X    sto_ptr    savprev;
  1529. X    sto_ptr    savnext;
  1530. X    char    pnul = 0;
  1531. X    char    nnul = 0;
  1532. X
  1533. X    if(store_gethdr(r,victim,&vbuf) == STO_ERR)
  1534. X        return(STO_ERR);
  1535. X
  1536. X    if((savnext = vbuf.next) != STO_NULL)
  1537. X        nnul++;
  1538. X    if((savprev = vbuf.prev) != STO_NULL)
  1539. X        pnul++;
  1540. X
  1541. X    if(nnul && store_gethdr(r,vbuf.next,&nbuf) == STO_ERR)
  1542. X        return(STO_ERR);
  1543. X
  1544. X    if(pnul && store_gethdr(r,vbuf.prev,&pbuf) == STO_ERR)
  1545. X        return(STO_ERR);
  1546. X
  1547. X    if(nnul)
  1548. X        nbuf.prev = vbuf.prev;
  1549. X    if(pnul)
  1550. X        pbuf.next = vbuf.next;
  1551. X
  1552. X    vbuf.prev = vbuf.next = STO_NULL;
  1553. X
  1554. X    if(store_puthdr(r,victim,&vbuf) == STO_ERR)
  1555. X        return(STO_ERR);
  1556. X
  1557. X    if(pnul && store_puthdr(r,savprev,&pbuf) == STO_ERR)
  1558. X        return(STO_ERR);
  1559. X
  1560. X    if(nnul && store_puthdr(r,savnext,&nbuf) == STO_ERR)
  1561. X        return(STO_ERR);
  1562. X
  1563. X    return(STO_OK);
  1564. X}
  1565. END_OF_FILE
  1566. if test 1457 -ne `wc -c <'b+tree/btdbmlib/stunlink.c'`; then
  1567.     echo shar: \"'b+tree/btdbmlib/stunlink.c'\" unpacked with wrong size!
  1568. fi
  1569. # end of 'b+tree/btdbmlib/stunlink.c'
  1570. fi
  1571. if test -f 'b+tree/btdbmlib/stwrite.c' -a "${1}" != "-c" ; then 
  1572.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stwrite.c'\"
  1573. else
  1574. echo shar: Extracting \"'b+tree/btdbmlib/stwrite.c'\" \(1482 characters\)
  1575. sed "s/^X//" >'b+tree/btdbmlib/stwrite.c' <<'END_OF_FILE'
  1576. X#include    <sys/types.h>
  1577. X#include    "stoconf.h"
  1578. X#include    "store.h"
  1579. X#include    "stointern.h"
  1580. X
  1581. X
  1582. X/*
  1583. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1584. X                    All rights reserved
  1585. X
  1586. X
  1587. X          This software, its documentation,  and  supporting
  1588. X          files  are  copyrighted  material  and may only be
  1589. X          distributed in accordance with the terms listed in
  1590. X          the COPYRIGHT document.
  1591. X*/
  1592. X
  1593. X
  1594. X#ifndef    lint
  1595. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stwrite.c,v 1.1 89/10/24 10:09:19 mjr Rel $";
  1596. X#endif
  1597. X
  1598. X/*
  1599. X    write(2)-like interface to write a record. accepts an offset, which
  1600. X    is treated as the point at which to start writing. if the write
  1601. X    extends the in-use space of the block, the header may be adjusted.
  1602. X*/
  1603. X
  1604. Xextern    off_t    lseek();
  1605. X
  1606. Xstore_write(r,rec,offset,buf,siz)
  1607. XSTORE    *r;
  1608. Xsto_ptr        rec;
  1609. Xoff_t        offset;
  1610. Xunsigned char    *buf;
  1611. Xint        siz;
  1612. X{
  1613. X    struct    sto_hdr    rbuf;
  1614. X
  1615. X    if(store_gethdr(r,rec,&rbuf) == STO_ERR)
  1616. X        return(STO_ERR);
  1617. X
  1618. X    if(siz > rbuf.size || (int)offset + siz > rbuf.size) {
  1619. X        store_errno(r) = STO_TOOSMALL;
  1620. X        return(STO_ERR);
  1621. X    }
  1622. X
  1623. X    if(offset > 0 && lseek(store_fileno(r),rec + STO_HSIZ + offset,SEEK_SET) != rec + STO_HSIZ + offset) {
  1624. X        store_errno(r) = STO_IOERR;
  1625. X        return(STO_ERR);
  1626. X    }
  1627. X
  1628. X    if(write(store_fileno(r),(char *)buf,siz) != siz)
  1629. X        return(STO_ERR);
  1630. X
  1631. X    /* has the buffer grown any ? */
  1632. X    if(offset + siz > rbuf.used) {
  1633. X        rbuf.used = offset + siz;
  1634. X        if(store_puthdr(r,rec,&rbuf) == STO_ERR)
  1635. X            return(STO_ERR);
  1636. X    }
  1637. X    return(STO_OK);
  1638. X}
  1639. END_OF_FILE
  1640. if test 1482 -ne `wc -c <'b+tree/btdbmlib/stwrite.c'`; then
  1641.     echo shar: \"'b+tree/btdbmlib/stwrite.c'\" unpacked with wrong size!
  1642. fi
  1643. # end of 'b+tree/btdbmlib/stwrite.c'
  1644. fi
  1645. if test -f 'b+tree/btdbmlib/stwsuper.c' -a "${1}" != "-c" ; then 
  1646.   echo shar: Will not clobber existing file \"'b+tree/btdbmlib/stwsuper.c'\"
  1647. else
  1648. echo shar: Extracting \"'b+tree/btdbmlib/stwsuper.c'\" \(791 characters\)
  1649. sed "s/^X//" >'b+tree/btdbmlib/stwsuper.c' <<'END_OF_FILE'
  1650. X#include    <sys/types.h>
  1651. X#include    "stoconf.h"
  1652. X#include    "store.h"
  1653. X
  1654. X
  1655. X/*
  1656. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1657. X                    All rights reserved
  1658. X
  1659. X
  1660. X          This software, its documentation,  and  supporting
  1661. X          files  are  copyrighted  material  and may only be
  1662. X          distributed in accordance with the terms listed in
  1663. X          the COPYRIGHT document.
  1664. X*/
  1665. X
  1666. X
  1667. X#ifndef    lint
  1668. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btdbmlib/RCS/stwsuper.c,v 1.1 89/10/24 10:09:19 mjr Rel $";
  1669. X#endif
  1670. X
  1671. X/*
  1672. X    synchronise a store file superblock.
  1673. X*/
  1674. X
  1675. Xextern    off_t    lseek();
  1676. X
  1677. Xstore_wsuper(r)
  1678. XSTORE    *r;
  1679. X{
  1680. X    if(lseek(store_fileno(r),0L,SEEK_SET) != 0L ||
  1681. X        write(store_fileno(r),(char *)&r->sblk,sizeof(struct sto_sb)) != sizeof(struct sto_sb))
  1682. X        return(STO_ERR);
  1683. X    return(STO_OK);
  1684. X}
  1685. END_OF_FILE
  1686. if test 791 -ne `wc -c <'b+tree/btdbmlib/stwsuper.c'`; then
  1687.     echo shar: \"'b+tree/btdbmlib/stwsuper.c'\" unpacked with wrong size!
  1688. fi
  1689. # end of 'b+tree/btdbmlib/stwsuper.c'
  1690. fi
  1691. if test ! -d 'b+tree/btlib' ; then
  1692.     echo shar: Creating directory \"'b+tree/btlib'\"
  1693.     mkdir 'b+tree/btlib'
  1694. fi
  1695. if test -f 'b+tree/btlib/Makefile' -a "${1}" != "-c" ; then 
  1696.   echo shar: Will not clobber existing file \"'b+tree/btlib/Makefile'\"
  1697. else
  1698. echo shar: Extracting \"'b+tree/btlib/Makefile'\" \(1408 characters\)
  1699. sed "s/^X//" >'b+tree/btlib/Makefile' <<'END_OF_FILE'
  1700. X#
  1701. X#
  1702. X#/*
  1703. X#         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1704. X#                    All rights reserved
  1705. X#
  1706. X#
  1707. X#          This software, its documentation,  and  supporting
  1708. X#          files  are  copyrighted  material  and may only be
  1709. X#          distributed in accordance with the terms listed in
  1710. X#          the COPYRIGHT document.
  1711. X#*/
  1712. X#
  1713. X# $Header: /atreus/mjr/hacks/btree/btlib/RCS/Makefile,v 1.1 89/10/24 10:09:08 mjr Rel $
  1714. X#
  1715. X
  1716. X# compiler to use
  1717. XCC= cc
  1718. X
  1719. X# compiler flags
  1720. X#CFLAGS= -p
  1721. XCFLAGS= -O
  1722. X
  1723. XLDFLAGS= -g
  1724. X
  1725. X# where to build the library. must be set in testrack/Makefile
  1726. X# if you change it from here.
  1727. XLIBDIR=..
  1728. XLIB=    $(LIBDIR)/libbtree.a
  1729. X
  1730. XCFILES=    btclose.c \
  1731. X    btdebug.c \
  1732. X    btdelete.c \
  1733. X    bterrors.c \
  1734. X    btfind.c \
  1735. X    btgoto.c \
  1736. X    btinsert.c \
  1737. X    btio.c \
  1738. X    btlabel.c \
  1739. X    btload.c \
  1740. X    btopen.c \
  1741. X    btoopen.c \
  1742. X    btpage1.c \
  1743. X    btpage2.c \
  1744. X    btravrs.c \
  1745. X    btseek.c \
  1746. X    btzap.c
  1747. X
  1748. XHFILES=    btconf.h \
  1749. X    btree.h \
  1750. X    btintern.h
  1751. X
  1752. XOFILES=    btclose.o \
  1753. X    btdebug.o \
  1754. X    btdelete.o \
  1755. X    bterrors.o \
  1756. X    btfind.o \
  1757. X    btgoto.o \
  1758. X    btio.o \
  1759. X    btinsert.o \
  1760. X    btlabel.o \
  1761. X    btload.o \
  1762. X    btopen.o \
  1763. X    btoopen.o \
  1764. X    btpage1.o \
  1765. X    btpage2.o \
  1766. X    btravrs.o \
  1767. X    btseek.o \
  1768. X    btzap.o
  1769. X
  1770. XFILES=    $(CFILES) \
  1771. X    $(HFILES) \
  1772. X    README \
  1773. X    Makefile
  1774. X
  1775. X$(LIB):    $(OFILES) 
  1776. X    ar crv $(LIB) $(OFILES)
  1777. X    ranlib $(LIB)
  1778. X
  1779. X$(OFILES): $(HFILES)
  1780. X
  1781. Xclean:
  1782. X    rm -f *.o $(LIB) core tags
  1783. X
  1784. Xci:
  1785. X    ci -u $(FILES) < /dev/null
  1786. X
  1787. Xtags:
  1788. X    ctags $(CFILES)
  1789. X
  1790. Xlint:    $(CFILES)
  1791. X    lint -u $(CFILES) | sed '/pointer alignment/d'
  1792. END_OF_FILE
  1793. if test 1408 -ne `wc -c <'b+tree/btlib/Makefile'`; then
  1794.     echo shar: \"'b+tree/btlib/Makefile'\" unpacked with wrong size!
  1795. fi
  1796. # end of 'b+tree/btlib/Makefile'
  1797. fi
  1798. if test -f 'b+tree/btlib/btclose.c' -a "${1}" != "-c" ; then 
  1799.   echo shar: Will not clobber existing file \"'b+tree/btlib/btclose.c'\"
  1800. else
  1801. echo shar: Extracting \"'b+tree/btlib/btclose.c'\" \(1075 characters\)
  1802. sed "s/^X//" >'b+tree/btlib/btclose.c' <<'END_OF_FILE'
  1803. X#include    <sys/types.h>
  1804. X#include    <stdio.h>
  1805. X#include    "btconf.h"
  1806. X#include    "btree.h"
  1807. X#include    "btintern.h"
  1808. X
  1809. X/*
  1810. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1811. X                    All rights reserved
  1812. X
  1813. X
  1814. X          This software, its documentation,  and  supporting
  1815. X          files  are  copyrighted  material  and may only be
  1816. X          distributed in accordance with the terms listed in
  1817. X          the COPYRIGHT document.
  1818. X*/
  1819. X
  1820. X#ifndef    lint
  1821. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/btclose.c,v 1.1 89/10/24 10:08:55 mjr Rel $";
  1822. X#endif
  1823. X
  1824. Xbt_close(b)
  1825. XBT_INDEX    *b;
  1826. X{
  1827. X    struct    bt_cache *p1;
  1828. X    struct    bt_cache *p2;
  1829. X    int    rv;
  1830. X
  1831. X    rv = bt_sync(b);
  1832. X
  1833. X    /* close fd */
  1834. X    if(bt_fileno(b) != -1)
  1835. X        if(close(bt_fileno(b)) < 0)
  1836. X            rv = BT_ERR;
  1837. X
  1838. X    /* free stack */
  1839. X    if(b->stack != NULL)
  1840. X        (void)free((char *)b->stack);
  1841. X
  1842. X    /* free cache */
  1843. X    for(p1 = b->lru; p1 != NULL;) {
  1844. X
  1845. X        /* K&R say not to use free()d stuff */
  1846. X        p2 = p1->next;
  1847. X
  1848. X        /* free it */
  1849. X        (void)free((char *)p1->p);
  1850. X        (void)free((char *)p1);
  1851. X        p1 = p2;
  1852. X    }
  1853. X
  1854. X    /* free handle itself */
  1855. X    (void)free((char *)b);
  1856. X    return(rv);
  1857. X}
  1858. END_OF_FILE
  1859. if test 1075 -ne `wc -c <'b+tree/btlib/btclose.c'`; then
  1860.     echo shar: \"'b+tree/btlib/btclose.c'\" unpacked with wrong size!
  1861. fi
  1862. # end of 'b+tree/btlib/btclose.c'
  1863. fi
  1864. if test -f 'b+tree/btlib/bterrors.c' -a "${1}" != "-c" ; then 
  1865.   echo shar: Will not clobber existing file \"'b+tree/btlib/bterrors.c'\"
  1866. else
  1867. echo shar: Extracting \"'b+tree/btlib/bterrors.c'\" \(1580 characters\)
  1868. sed "s/^X//" >'b+tree/btlib/bterrors.c' <<'END_OF_FILE'
  1869. X#include    <sys/types.h>
  1870. X#include    <stdio.h>
  1871. X#include    "btconf.h"
  1872. X#include    "btree.h"
  1873. X
  1874. X/*
  1875. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1876. X                    All rights reserved
  1877. X
  1878. X
  1879. X          This software, its documentation,  and  supporting
  1880. X          files  are  copyrighted  material  and may only be
  1881. X          distributed in accordance with the terms listed in
  1882. X          the COPYRIGHT document.
  1883. X*/
  1884. X
  1885. X#ifndef    lint
  1886. Xstatic    char    *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/bterrors.c,v 1.1 89/10/24 10:08:56 mjr Rel $";
  1887. X#endif
  1888. X
  1889. X
  1890. Xchar    *bt_errs[] = {
  1891. X/* BT_NOERROR */        "no btree error",
  1892. X/* BT_KTOBIG */            "btree key too big",
  1893. X/* BT_ZEROKEY */        "zero sized btree key",
  1894. X/* BT_DUPKEY */            "duplicate btree key",
  1895. X/* BT_PTRINVAL */        "invalid btree pointer",
  1896. X/* BT_NOBUFFERS */        "insufficient btree buffers",
  1897. X/* BT_LTOOBIG */        "btree label too big",
  1898. X/* BT_BTOOSMALL */        "btree buffer too small",
  1899. X/* BT_BADPAGE */        "btree page is corrupt",
  1900. X/* BT_PAGESRCH */        "cannot search btree page",
  1901. X/* BT_BADUSERARG */        "invalid btree argument",
  1902. X0};
  1903. X
  1904. X/* system error # */
  1905. Xextern    int    errno;
  1906. X
  1907. Xvoid
  1908. Xbt_perror(b,s)
  1909. XBT_INDEX    *b;
  1910. Xchar        *s;
  1911. X{
  1912. X    static    char    *cmesg = "cannot open";
  1913. X    static    char    *fmt1 = "%s\n";
  1914. X    static    char    *fmt2 = "%s: %s\n";
  1915. X
  1916. X    if(b == NULL) {
  1917. X        if(s == NULL || *s == '\0')
  1918. X            (void)fprintf(stderr,fmt1,cmesg);
  1919. X        else
  1920. X            (void)fprintf(stderr,fmt2,s,cmesg);
  1921. X        return;
  1922. X    }
  1923. X    if(bt_errno(b) == BT_NOERROR && errno != 0) {
  1924. X        perror(s);
  1925. X    } else {
  1926. X        if(s == NULL || *s == '\0')
  1927. X            (void)fprintf(stderr,fmt1,bt_errs[bt_errno(b)]);
  1928. X        else
  1929. X            (void)fprintf(stderr,fmt2,s,bt_errs[bt_errno(b)]);
  1930. X    }
  1931. X}
  1932. END_OF_FILE
  1933. if test 1580 -ne `wc -c <'b+tree/btlib/bterrors.c'`; then
  1934.     echo shar: \"'b+tree/btlib/bterrors.c'\" unpacked with wrong size!
  1935. fi
  1936. # end of 'b+tree/btlib/bterrors.c'
  1937. fi
  1938. if test -f 'b+tree/btlib/btfind.c' -a "${1}" != "-c" ; then 
  1939.   echo shar: Will not clobber existing file \"'b+tree/btlib/btfind.c'\"
  1940. else
  1941. echo shar: Extracting \"'b+tree/btlib/btfind.c'\" \(1226 characters\)
  1942. sed "s/^X//" >'b+tree/btlib/btfind.c' <<'END_OF_FILE'
  1943. X#include    <sys/types.h>
  1944. X#include    <stdio.h>
  1945. X#include    "btconf.h"
  1946. X#include    "btree.h"
  1947. X#include    "btintern.h"
  1948. X
  1949. X/*
  1950. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  1951. X                    All rights reserved
  1952. X
  1953. X
  1954. X          This software, its documentation,  and  supporting
  1955. X          files  are  copyrighted  material  and may only be
  1956. X          distributed in accordance with the terms listed in
  1957. X          the COPYRIGHT document.
  1958. X*/
  1959. X
  1960. X
  1961. X#ifndef    lint
  1962. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/btfind.c,v 1.1 89/10/24 10:08:57 mjr Rel $";
  1963. X#endif
  1964. X
  1965. Xbt_find(b,key,len,rrn)
  1966. XBT_INDEX    *b;
  1967. Xbt_chrp        key;
  1968. Xint        len;
  1969. Xoff_t        *rrn;
  1970. X{
  1971. X    struct    bt_cache *op;    /* old page */
  1972. X    int    sr;
  1973. X
  1974. X    if(len > BT_MAXK(b)) {
  1975. X        bt_errno(b) == BT_KTOOBIG;
  1976. X        return(BT_ERR);
  1977. X    }
  1978. X
  1979. X    if(len <= 0) {
  1980. X        bt_errno(b) == BT_ZEROKEY;
  1981. X        return(BT_ERR);
  1982. X    }
  1983. X
  1984. X    if(bt_seekdown(b,key,len) == BT_ERR)
  1985. X        return(BT_ERR);
  1986. X
  1987. X    if((op = bt_rpage(b,b->stack[b->sblk.levs - 1].pg)) == NULL)
  1988. X        return(BT_ERR);
  1989. X
  1990. X    b->cpag = op->num;
  1991. X
  1992. X    /* mark all as well with tree */
  1993. X    bt_clearerr(b);
  1994. X
  1995. X    sr = bt_srchpg(key,len,bt_dtype(b),b->cmpfn,rrn,&b->cky,op->p);
  1996. X    if(sr == BT_OK)
  1997. X        return(BT_OK);
  1998. X    if(sr == BT_ERR) {
  1999. X        bt_errno(b) = BT_PAGESRCH;
  2000. X        return(BT_ERR);
  2001. X    }
  2002. X    b->cky--;
  2003. X    return(BT_NF);
  2004. X}
  2005. END_OF_FILE
  2006. if test 1226 -ne `wc -c <'b+tree/btlib/btfind.c'`; then
  2007.     echo shar: \"'b+tree/btlib/btfind.c'\" unpacked with wrong size!
  2008. fi
  2009. # end of 'b+tree/btlib/btfind.c'
  2010. fi
  2011. if test -f 'b+tree/btlib/btgoto.c' -a "${1}" != "-c" ; then 
  2012.   echo shar: Will not clobber existing file \"'b+tree/btlib/btgoto.c'\"
  2013. else
  2014. echo shar: Extracting \"'b+tree/btlib/btgoto.c'\" \(1571 characters\)
  2015. sed "s/^X//" >'b+tree/btlib/btgoto.c' <<'END_OF_FILE'
  2016. X#include    <sys/types.h>
  2017. X#include    <stdio.h>
  2018. X#include    "btconf.h"
  2019. X#include    "btree.h"
  2020. X#include    "btintern.h"
  2021. X
  2022. X/*
  2023. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2024. X                    All rights reserved
  2025. X
  2026. X
  2027. X          This software, its documentation,  and  supporting
  2028. X          files  are  copyrighted  material  and may only be
  2029. X          distributed in accordance with the terms listed in
  2030. X          the COPYRIGHT document.
  2031. X*/
  2032. X
  2033. X#ifndef    lint
  2034. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/btgoto.c,v 1.1 89/10/24 10:08:58 mjr Rel $";
  2035. X#endif
  2036. X
  2037. X
  2038. Xextern    char    *realloc();
  2039. X
  2040. Xbt_goto(b,d)
  2041. XBT_INDEX    *b;
  2042. Xint        d;
  2043. X{
  2044. X    int    l = 0;
  2045. X    struct    bt_cache *p;
  2046. X
  2047. X    b->stack[0].pg = b->sblk.root;
  2048. X
  2049. X    while(1) {
  2050. X        if((p = bt_rpage(b,b->stack[l].pg)) == NULL)
  2051. X            return(BT_ERR);
  2052. X
  2053. X        /* dynamically deal w/ stack overruns */
  2054. X        if(l == b->shih - 2) {
  2055. X            b->shih += 3;
  2056. X            b->stack = (struct bt_stack *)realloc((char *)b->stack,(unsigned)(b->shih * sizeof(struct bt_stack)));
  2057. X            if(b->stack == NULL)
  2058. X                return(BT_ERR);
  2059. X        }
  2060. X
  2061. X        /* set the key to be one AFTER or BEFORE the real */
  2062. X        /* end of the tree. we preincrement keys when doing */
  2063. X        /* next so this is OK to do, though a bit hokey */
  2064. X        if(HIPT(p->p) == BT_NULL) {
  2065. X            b->cpag = p->num;
  2066. X            if(d == BT_EOF)
  2067. X                b->cky =  KEYCNT(p->p);
  2068. X            else
  2069. X                b->cky =  -1;
  2070. X
  2071. X            /* mark all as well with tree */
  2072. X            bt_clearerr(b);
  2073. X            return(BT_OK);
  2074. X        }
  2075. X    
  2076. X        /* have not yet hit a leaf - go high or low, as approp. */
  2077. X        if(d == BT_EOF || KEYCNT(p->p) == 0) {
  2078. X            b->stack[++l].pg = HIPT(p->p);
  2079. X        } else {
  2080. X            b->stack[++l].pg = *(off_t *)KEYCLD(p->p);
  2081. X        }
  2082. X    }
  2083. X}
  2084. END_OF_FILE
  2085. if test 1571 -ne `wc -c <'b+tree/btlib/btgoto.c'`; then
  2086.     echo shar: \"'b+tree/btlib/btgoto.c'\" unpacked with wrong size!
  2087. fi
  2088. # end of 'b+tree/btlib/btgoto.c'
  2089. fi
  2090. if test -f 'b+tree/btlib/btlabel.c' -a "${1}" != "-c" ; then 
  2091.   echo shar: Will not clobber existing file \"'b+tree/btlib/btlabel.c'\"
  2092. else
  2093. echo shar: Extracting \"'b+tree/btlib/btlabel.c'\" \(1264 characters\)
  2094. sed "s/^X//" >'b+tree/btlib/btlabel.c' <<'END_OF_FILE'
  2095. X#include    <sys/types.h>
  2096. X#include    <sys/file.h>
  2097. X#include    "btconf.h"
  2098. X#include    "btree.h"
  2099. X
  2100. X/*
  2101. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2102. X                    All rights reserved
  2103. X
  2104. X
  2105. X          This software, its documentation,  and  supporting
  2106. X          files  are  copyrighted  material  and may only be
  2107. X          distributed in accordance with the terms listed in
  2108. X          the COPYRIGHT document.
  2109. X*/
  2110. X
  2111. X
  2112. X#ifndef    lint
  2113. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/btlabel.c,v 1.1 89/10/24 10:08:59 mjr Rel $";
  2114. X#endif
  2115. X
  2116. Xextern    off_t    lseek();
  2117. X
  2118. Xbt_wlabel(b,buf,siz)
  2119. XBT_INDEX    *b;
  2120. Xbt_chrp        buf;
  2121. Xint        siz;
  2122. X{
  2123. X    if(siz > BT_LABSIZ(b)) {
  2124. X        bt_errno(b) = BT_LTOOBIG;
  2125. X        return(BT_ERR);
  2126. X    }
  2127. X
  2128. X    if((lseek(bt_fileno(b),(off_t)sizeof(struct bt_super),SEEK_SET) !=
  2129. X        (off_t)sizeof(struct bt_super)) ||
  2130. X        (write(bt_fileno(b),(char *)buf,siz) != siz))
  2131. X            return(BT_ERR);
  2132. X    bt_clearerr(b);
  2133. X    return(BT_OK);
  2134. X}
  2135. X
  2136. Xbt_rlabel(b,buf,siz)
  2137. XBT_INDEX    *b;
  2138. Xbt_chrp        buf;
  2139. Xint        siz;
  2140. X{
  2141. X    if(siz < BT_LABSIZ(b)) {
  2142. X        bt_errno(b) = BT_BTOOSMALL;
  2143. X        return(BT_ERR);
  2144. X    }
  2145. X
  2146. X    if((lseek(bt_fileno(b),(off_t)sizeof(struct bt_super),SEEK_SET) !=
  2147. X        (off_t)sizeof(struct bt_super)) ||
  2148. X        (read(bt_fileno(b),(char *)buf,BT_LABSIZ(b)) != BT_LABSIZ(b)))
  2149. X            return(BT_ERR);
  2150. X    bt_clearerr(b);
  2151. X    return(BT_OK);
  2152. X}
  2153. END_OF_FILE
  2154. if test 1264 -ne `wc -c <'b+tree/btlib/btlabel.c'`; then
  2155.     echo shar: \"'b+tree/btlib/btlabel.c'\" unpacked with wrong size!
  2156. fi
  2157. # end of 'b+tree/btlib/btlabel.c'
  2158. fi
  2159. if test -f 'b+tree/btlib/btseek.c' -a "${1}" != "-c" ; then 
  2160.   echo shar: Will not clobber existing file \"'b+tree/btlib/btseek.c'\"
  2161. else
  2162. echo shar: Extracting \"'b+tree/btlib/btseek.c'\" \(1330 characters\)
  2163. sed "s/^X//" >'b+tree/btlib/btseek.c' <<'END_OF_FILE'
  2164. X#include    <sys/types.h>
  2165. X#include    <stdio.h>
  2166. X#include    "btconf.h"
  2167. X#include    "btree.h"
  2168. X#include    "btintern.h"
  2169. X
  2170. X/*
  2171. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2172. X                    All rights reserved
  2173. X
  2174. X
  2175. X          This software, its documentation,  and  supporting
  2176. X          files  are  copyrighted  material  and may only be
  2177. X          distributed in accordance with the terms listed in
  2178. X          the COPYRIGHT document.
  2179. X*/
  2180. X
  2181. X
  2182. X#ifndef    lint
  2183. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/btseek.c,v 1.1 89/10/24 10:09:06 mjr Rel $";
  2184. X#endif
  2185. X
  2186. Xextern    char    *realloc();
  2187. X
  2188. Xbt_seekdown(b,key,len)
  2189. XBT_INDEX    *b;
  2190. Xbt_chrp        key;
  2191. Xint        len;
  2192. X{
  2193. X    /* bt_find just seeks down to leaf level, sets the stack, ends */
  2194. X
  2195. X    int    l = 0;
  2196. X    int    sr;
  2197. X    struct    bt_cache *p;
  2198. X
  2199. X    b->stack[0].pg = b->sblk.root;
  2200. X
  2201. X    while(1) {
  2202. X        if((p = bt_rpage(b,b->stack[l].pg)) == NULL)
  2203. X            return(BT_ERR);
  2204. X        if(HIPT(p->p) == BT_NULL) {
  2205. X            return(BT_OK);
  2206. X        }
  2207. X        sr = bt_srchpg(key,len,bt_dtype(b),b->cmpfn,&b->stack[l + 1].pg,&b->stack[l].ky,p->p);
  2208. X        if(sr == BT_ERR) {
  2209. X            bt_errno(b) = BT_PAGESRCH;
  2210. X            return(BT_ERR);
  2211. X        }
  2212. X
  2213. X        /* dynamically deal w/ stack overruns */
  2214. X        if(l == b->shih - 2) {
  2215. X            b->shih += 3;
  2216. X            b->stack = (struct bt_stack *)realloc((char *)b->stack,(unsigned)(b->shih * sizeof(struct bt_stack)));
  2217. X            if(b->stack == NULL)
  2218. X                return(BT_ERR);
  2219. X        }
  2220. X
  2221. X        l++;
  2222. X    }
  2223. X}
  2224. END_OF_FILE
  2225. if test 1330 -ne `wc -c <'b+tree/btlib/btseek.c'`; then
  2226.     echo shar: \"'b+tree/btlib/btseek.c'\" unpacked with wrong size!
  2227. fi
  2228. # end of 'b+tree/btlib/btseek.c'
  2229. fi
  2230. if test -f 'b+tree/btlib/btzap.c' -a "${1}" != "-c" ; then 
  2231.   echo shar: Will not clobber existing file \"'b+tree/btlib/btzap.c'\"
  2232. else
  2233. echo shar: Extracting \"'b+tree/btlib/btzap.c'\" \(1212 characters\)
  2234. sed "s/^X//" >'b+tree/btlib/btzap.c' <<'END_OF_FILE'
  2235. X#include    <sys/types.h>
  2236. X#include    <stdio.h>
  2237. X#include    "btconf.h"
  2238. X#include    "btree.h"
  2239. X#include    "btintern.h"
  2240. X
  2241. X/*
  2242. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2243. X                    All rights reserved
  2244. X
  2245. X
  2246. X          This software, its documentation,  and  supporting
  2247. X          files  are  copyrighted  material  and may only be
  2248. X          distributed in accordance with the terms listed in
  2249. X          the COPYRIGHT document.
  2250. X*/
  2251. X
  2252. X
  2253. X#ifndef    lint
  2254. Xstatic char *rcsid = "$Header: /atreus/mjr/hacks/btree/btlib/RCS/btzap.c,v 1.1 89/10/24 10:09:06 mjr Rel $";
  2255. X#endif
  2256. X
  2257. Xbt_zap(b)
  2258. XBT_INDEX    *b;
  2259. X{
  2260. X    struct    bt_cache *op;
  2261. X
  2262. X    /* toast superblock */
  2263. X    b->sblk.levs = 1;
  2264. X    b->sblk.root = bt_pagesiz(b);
  2265. X    b->sblk.free = BT_NULL;
  2266. X    b->sblk.high = 2 * bt_pagesiz(b);
  2267. X    b->dirt++;
  2268. X    if(bt_wsuper(b) == BT_ERR)
  2269. X        return(BT_ERR);
  2270. X
  2271. X    /* set up first leaf */
  2272. X    if((op = bt_rpage(b,BT_NULL)) == NULL)
  2273. X        return(BT_ERR);
  2274. X
  2275. X    /* note - set cky and cpag case called by bt_load() */
  2276. X    op->num = b->sblk.root; 
  2277. X    KEYCNT(op->p) = 0;
  2278. X    KEYLEN(op->p) = 0;
  2279. X    LSIB(op->p) = RSIB(op->p) = BT_NULL;
  2280. X    HIPT(op->p) = BT_NULL;
  2281. X
  2282. X    op->flags = BT_CHE_DIRTY;
  2283. X
  2284. X#ifdef    USE_FTRUNCATE
  2285. X    if(ftruncate(bt_fileno(b),b->sblk.high) == -1)
  2286. X        return(BT_ERR);
  2287. X#endif
  2288. X
  2289. X    return(bt_wpage(b,op));
  2290. X}
  2291. END_OF_FILE
  2292. if test 1212 -ne `wc -c <'b+tree/btlib/btzap.c'`; then
  2293.     echo shar: \"'b+tree/btlib/btzap.c'\" unpacked with wrong size!
  2294. fi
  2295. # end of 'b+tree/btlib/btzap.c'
  2296. fi
  2297. if test ! -d 'b+tree/doc' ; then
  2298.     echo shar: Creating directory \"'b+tree/doc'\"
  2299.     mkdir 'b+tree/doc'
  2300. fi
  2301. if test -f 'b+tree/doc/Makefile' -a "${1}" != "-c" ; then 
  2302.   echo shar: Will not clobber existing file \"'b+tree/doc/Makefile'\"
  2303. else
  2304. echo shar: Extracting \"'b+tree/doc/Makefile'\" \(815 characters\)
  2305. sed "s/^X//" >'b+tree/doc/Makefile' <<'END_OF_FILE'
  2306. X#
  2307. X#
  2308. X#/*
  2309. X#         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2310. X#                    All rights reserved
  2311. X#
  2312. X#
  2313. X#          This software, its documentation,  and  supporting
  2314. X#          files  are  copyrighted  material  and may only be
  2315. X#          distributed in accordance with the terms listed in
  2316. X#          the COPYRIGHT document.
  2317. X#*/
  2318. X#
  2319. X# $Header: /atreus/mjr/hacks/btree/doc/RCS/Makefile,v 1.5 89/10/23 17:19:35 mjr Rel $
  2320. X#
  2321. X
  2322. X# formatter to use
  2323. XFMT= psroff
  2324. X
  2325. X# formatter flags
  2326. XFMTFLAGS= -man
  2327. X
  2328. X# where to install the man pages.
  2329. XMANDIR=    /usr/man/man3
  2330. XMAN=    $(MANDIR)/btree.3
  2331. X
  2332. XDOCS=    btdbm.3 \
  2333. X    btree.3 \
  2334. X    store.3
  2335. X
  2336. Xall:    
  2337. X
  2338. Xclean:
  2339. X    rm -f store.txt btree.txt
  2340. X
  2341. Xci:    clean
  2342. X    ci -u $(DOCS) Makefile  < /dev/null
  2343. X
  2344. Xprint:
  2345. X    $(FMT) $(FMTFLAGS) $(DOCS)
  2346. X
  2347. Xascii:
  2348. X    nroff $(FMTFLAGS) btree.3 > btree.txt
  2349. X    nroff $(FMTFLAGS) store.3 > store.txt
  2350. END_OF_FILE
  2351. if test 815 -ne `wc -c <'b+tree/doc/Makefile'`; then
  2352.     echo shar: \"'b+tree/doc/Makefile'\" unpacked with wrong size!
  2353. fi
  2354. # end of 'b+tree/doc/Makefile'
  2355. fi
  2356. if test ! -d 'b+tree/utils' ; then
  2357.     echo shar: Creating directory \"'b+tree/utils'\"
  2358.     mkdir 'b+tree/utils'
  2359. fi
  2360. if test -f 'b+tree/utils/flog.sh' -a "${1}" != "-c" ; then 
  2361.   echo shar: Will not clobber existing file \"'b+tree/utils/flog.sh'\"
  2362. else
  2363. echo shar: Extracting \"'b+tree/utils/flog.sh'\" \(695 characters\)
  2364. sed "s/^X//" >'b+tree/utils/flog.sh' <<'END_OF_FILE'
  2365. X#
  2366. X#/*
  2367. X#         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2368. X#                    All rights reserved
  2369. X#
  2370. X#
  2371. X#          This software, its documentation,  and  supporting
  2372. X#          files  are  copyrighted  material  and may only be
  2373. X#          distributed in accordance with the terms listed in
  2374. X#          the COPYRIGHT document.
  2375. X#*/
  2376. X
  2377. Xcnt=1
  2378. Xkeys=2000
  2379. Xlengths=8
  2380. Xpagesiz=61
  2381. Xwhile [ 1  = 1 ]; do
  2382. X    echo "$keys keys for #$cnt ..."
  2383. X    words $keys $lengths > input
  2384. X    sort input | uniq > input.srt
  2385. X    echo "running #$cnt ..."
  2386. X    testrack input input.srt $pagesiz
  2387. X    if [ $? != 0 ]; then
  2388. X        echo " failed!"
  2389. X        echo "input producing the failure is left in \"input\""
  2390. X        exit 1
  2391. X    fi
  2392. X    echo "passed"
  2393. X
  2394. X    cnt=`expr $cnt + 1`
  2395. Xdone
  2396. END_OF_FILE
  2397. if test 695 -ne `wc -c <'b+tree/utils/flog.sh'`; then
  2398.     echo shar: \"'b+tree/utils/flog.sh'\" unpacked with wrong size!
  2399. fi
  2400. # end of 'b+tree/utils/flog.sh'
  2401. fi
  2402. if test -f 'b+tree/utils/words.c' -a "${1}" != "-c" ; then 
  2403.   echo shar: Will not clobber existing file \"'b+tree/utils/words.c'\"
  2404. else
  2405. echo shar: Extracting \"'b+tree/utils/words.c'\" \(1027 characters\)
  2406. sed "s/^X//" >'b+tree/utils/words.c' <<'END_OF_FILE'
  2407. X#include    <stdio.h>
  2408. X
  2409. X/*
  2410. X         (C) Copyright, 1988, 1989 Marcus J. Ranum
  2411. X                    All rights reserved
  2412. X
  2413. X
  2414. X          This software, its documentation,  and  supporting
  2415. X          files  are  copyrighted  material  and may only be
  2416. X          distributed in accordance with the terms listed in
  2417. X          the COPYRIGHT document.
  2418. X*/
  2419. X
  2420. X
  2421. Xextern    long    random();
  2422. Xextern    long    time();
  2423. X
  2424. Xmain(ac,av)
  2425. Xint    ac;
  2426. Xchar    *av[];
  2427. X{
  2428. X    char    buf[BUFSIZ];
  2429. X    int    todo;
  2430. X    int    maxlen = 50;
  2431. X    int    len;
  2432. X    long    junk;
  2433. X    int    x;
  2434. X    int    y;
  2435. X
  2436. X    (void)time(&junk);
  2437. X    (void)srandom((int)junk);
  2438. X
  2439. X    if(ac < 3) {
  2440. X        (void)fprintf(stderr,"usage: words count [len]\n");
  2441. X        exit(1);
  2442. X    }
  2443. X
  2444. X    /* how many inserts to perform */
  2445. X    todo = atoi(av[1]);
  2446. X
  2447. X    if(ac > 2) {
  2448. X        maxlen = atoi(av[2]);
  2449. X        if(maxlen < 1) {
  2450. X            (void)fprintf(stderr,"max len less than 1 is stupid!\n");
  2451. X            exit(1);
  2452. X        }
  2453. X    }
  2454. X
  2455. X    for(x = 0; x < todo; x++) {
  2456. X        len = ((int)random() % maxlen) + 1;
  2457. X        for(y = 0; y < len; y++)
  2458. X            buf[y] = ((int)random() % 25) + 'a';        
  2459. X
  2460. X        buf[len] = '\0';
  2461. X        (void)printf("%s\n",buf);
  2462. X    }
  2463. X    exit(0);
  2464. X}
  2465. END_OF_FILE
  2466. if test 1027 -ne `wc -c <'b+tree/utils/words.c'`; then
  2467.     echo shar: \"'b+tree/utils/words.c'\" unpacked with wrong size!
  2468. fi
  2469. # end of 'b+tree/utils/words.c'
  2470. fi
  2471. echo shar: End of archive 1 \(of 5\).
  2472. cp /dev/null ark1isdone
  2473. MISSING=""
  2474. for I in 1 2 3 4 5 ; do
  2475.     if test ! -f ark${I}isdone ; then
  2476.     MISSING="${MISSING} ${I}"
  2477.     fi
  2478. done
  2479. if test "${MISSING}" = "" ; then
  2480.     echo You have unpacked all 5 archives.
  2481.     rm -f ark[1-9]isdone
  2482. else
  2483.     echo You still need to unpack the following archives:
  2484.     echo "        " ${MISSING}
  2485. fi
  2486. ##  End of shell archive.
  2487. exit 0
  2488.  
  2489.